C ++:指向另一个类函数的函数指针

时间:2011-12-22 06:05:11

标签: c++ function pointers

我有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个参数的函数。

请帮助

3 个答案:

答案 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函数和类继承