假设我有两节课

class A
{
  public:
    void foo( /* ............. */ );
};

class B
{
   public:
      void bar();
};

我想知道,是否甚至可以将foo方法的指针传递给bar方法,将其存储在A中,然后稍后从bar运行A。我应该说,A不知道,bar是哪个类的成员!

如果您向我展示该主题的语法或链接没有那么复杂,我将不胜感激。

说明
我正在为C++设计observer模式。我想将B订阅A的一些事件。例如此代码应在B的实例中
   // pseudo code
   A* observable = new A();
   observable->addEventListener ( 'eventTitle' , functionName );

并且当eventTitle发生时A调用functionNameB

最佳答案

有两种方法可以调用指向成员函数的指针,以隐藏其起源:

  • 使用std::function和std::bind:
    class B {
        double Sqrt(int what) { return std::sqrt((double)what); }
    };
    
    // in A:
    std::tr1::function<double (int)> fn;
    fn = std::tr1::bind(&B::Sqrt, &operations, std::tr1::placeholders::_1);
    fn(3.1415);
    
  • 使用函子,该函子将指向成员函数的指针和将在其上被调用的对象togeter包裹起来。 (不过,这有点复杂,并且原则上只是std::function的一部分)。
  • 从抽象接口(interface)IFn派生B,并将B作为IFn引用传递给Foo。 Foo将知道要调用什么-接口(interface)的虚拟Do()函数。
  • 10-05 21:13
    查看更多