传递函数名作为C ++类中另一个函数的参数

时间:2012-03-03 09:06:15

标签: c++ function

我有两个A和B类。我想在A类中传递一个函数名作为B类函数的参数。我尝试使用下面的示例,这是正确的方法。

class A
{
  public:
  B m_b;

  void MyFun()
  {
      // do something
  }

  void Test()
  {
  m_b.Process( MyFun );
  } 
}


class B
{
 public:
 void Process( void (*f)() )
 {
   (*f)();
 }
}

提前致谢

3 个答案:

答案 0 :(得分:3)

由于MyFun是类A的成员函数,因此需要指向成员的指针而不是常规函数指针,并且还需要类A的实例调用函数:

class B
{
 public:
 void Process(A *obj, void (A::*f)() )
 {
   (obj->*f)();
 }
}

答案 1 :(得分:1)

实际上,如果MyFun不是您的类的静态成员,则它具有类型为A*的隐藏参数,因此实现方式如下:m_a.MyFun(...) =〜{{ 1}}。

所以,你想要的可能是一个静态函数MyFunImpl(&m_a, ...)(你不能在其中使用MyFun),而在this内部调用B::Process

如果您需要传递f(),请参阅this的答案(指向成员函数的指针)。

否则,如果要传递参数,可以在此之前查找casablanca或lambda函数(C ++ 0x)或std::bind

答案 2 :(得分:1)

按照此处的建议:http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.4,您最终会得到:

class A;
typedef void (A::*MemFun)();

class B 
{ 
 public: 
 void Process(A& a, MemFun mf) 
 { 
   (a.*mf)(); 
 } 
}; 

class A 
{ 
  public: 
  B m_b; 

  void MyFun() 
  { 
    // do something 
  } 

  void Test() 
  { 
    MemFun p = &A::MyFun;
    A a;
    m_b.Process(a, p); 
  }  
};
相关问题