我有2个班级
class B {
public:
int func(int i);
};
class A {
public:
typedef int (B::*fPtr)(int);
void run();
B* mB;
};
void A::run() {
// create a pointer
fPtr p = &(B::func);
// invoke the function
mB->*p(2); <------- Compilation Error
}
我需要的是在A的run函数中创建一个指向func()的指针。我得到一个编译错误,说mB不对应带有1个参数的函数。
请帮助
答案 0 :(得分:6)
您需要在函数表达式周围添加括号:
(mB->*p)(2);
但正如其他人所指出的那样,几乎可以肯定有更好的方法去做你想做的事情。
答案 1 :(得分:2)
类上的实例方法总是有this
指针隐藏的第一个参数,因此它与函数指针typedef不兼容。无法直接获取指向成员函数的指针。典型的解决方法是使用“thunk”,在其中传递一个静态函数,该函数接受通用的“catch all”参数(例如void *
),该参数可以静态地转换为您可以调用的指针成员函数。例如:
class B
{
public:
static void MyThunk(void * obj)
{
static_cast<B *>(obj)->MyRealFunc();
}
void MyRealFunc()
{
// do something here
}
// . . .
};
您可以轻松获取指向静态函数的指针,因为它没有“隐藏this
”,只需使用B::MyThunk
引用它。如果您的函数需要其他参数,您可以使用类似functor的内容来捕获必要参数和状态。
你一定要阅读这个C ++ FAQ Lite页面,它会告诉你更多关于这一切的信息:Pointers to member functions
答案 2 :(得分:1)
为什么不打电话给mB->func(2);
?
如果您需要B的不同功能,可以查看virtual
函数和类继承