2

比方说,我有两节课

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

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

我想知道,是否甚至可以将foo方法指针传递给bar方法,将其A存储barA. 我应该说,那A不会知道,是哪个班级bar的成员!

如果您向我展示语法或一些链接,而不是对该主题的复杂描述,我将不胜感激。

描述 我正在observer为 C++ 设计一个模式。我想订阅B一些事件A。例如,这段代码应该在一个实例中B

   // pseudo code    
   A* observable = new A();
   observable->addEventListener ( 'eventTitle' , functionName );

eventTitle发生A调用functionNameB

4

4 回答 4

2

除非bar被声明staticB. 您应该考虑到您需要一个实例B才能调用任何非静态方法。

(查看关于指向成员函数的 C++ 常见问题解答章节以获得更深入的解释。)

更新:如果你想实现一个观察者模式,你可以声明一个接口(纯抽象类),比如说Observer,它A知道并使用指向成员函数的指针将你的事件映射到相应的Observer方法。

例子:

   A observable;
   observable.addEventListener ( 'eventTitle' , &B::functionName );
   B observer;
   observable.registerObserver(&observer);
于 2012-08-20T12:53:01.677 回答
2

如何在不了解它A的情况下使用成员函数?B要调用它,您需要一个对象,该对象必须是 o 类型B(或子类型),因此A必须具备此知识。

如果您创建bar()一个静态函数,您可以使用常规函数指针 ( void (*)()) 或std::function<void ()>(boost::function对于较旧的 C++) - 我强烈推荐后者。

于 2012-08-20T12:55:50.720 回答
2

有几种方法可以调用指向成员函数的指针,隐藏它的来源:

  • 使用 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);
    
  • 使用仿函数,它将指向成员函数的指针和要在其上调用的对象一起包装。(不过,这有点复杂,原则上只是 std::function 的一个子集)。

  • 从抽象接口 IFn 派生 B 并将 B 作为 IFn 引用传递给 Foo。Foo 将知道要调用什么 - 接口的虚拟 Do() 函数。
于 2012-08-20T13:05:06.657 回答
1

使用类似的东西:

class A
{
public:
  void foo( /* ............. */ );
  void SetObs(CObs *pObs)
  {
    m_pObs = pObs;
  }

private:
  CObs *m_pObs;
};

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

class CObs
{
public:
  virtual void bar() = 0;
};

并且每当您需要 bar() 函数时调用 m_pObs->bar()。还从 CObs 派生所有像 B 这样的 slasses 并覆盖函数 bar()。

于 2012-08-20T12:57:48.033 回答