指向类成员函数的指针

时间:2012-08-20 12:46:35

标签: c++ class function pointers member

让我们说,我有两个班级

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

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

我想知道,如果甚至可以向foo方法传递bar方法的指针,请将其存储在A中并稍后从bar运行A {1}}。我应该说,A不知道,bar是哪个班级的成员!

如果你向我展示语法或某些链接而不是那个复杂的主题描述,我会非常感激。

描述 我正在为C ++设计observer模式。我想为B的某些事件订阅A。例如此代码应位于B

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

eventTitle发生时A调用functionName的{​​{1}}

4 个答案:

答案 0 :(得分:2)

除非bar被声明为static的{​​{1}}成员,否则无效。您应该考虑到需要B的实例才能调用任何非静态方法。

(查看C++ FAQ chapter on pointer-to-member-functions以获得更深入的解释。)

UPDATE :如果你想实现一个观察者模式,你可以声明一个接口(纯抽象类),比如BObserver知道并使用指针 - to-member-functions,用于将事件映射到相应的A方法。

示例:

Observer

答案 1 :(得分:2)

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

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

答案 2 :(得分: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()函数。

答案 3 :(得分: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-&gt; bar()。还从CObs派生所有类似B的类并覆盖函数bar()。