我有两个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)();
}
}
提前致谢
答案 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);
}
};