指向另一个类函数的函数指针

C++: Function pointer to another class function

本文关键字:函数 指针 类函数 另一个      更新时间:2023-10-16

我有两个类

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的运行函数中创建一个指向func()的指针。我得到一个编译错误,说mB不对应于具有1个参数的函数。

请帮忙

你需要用圆括号括住函数表达式:

(mB->*p)(2);

但正如其他人所指出的,几乎肯定有更好的方法来做你想做的事情。

类上的实例方法总是有一个隐藏的this指针的第一个参数,因此它与函数指针类型定义不兼容。没有办法直接获取成员函数的指针。典型的解决方法是使用"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引用它。如果你的函数需要额外的形参,你可以使用类似于函子的东西来捕获必要的形参和状态。

你绝对应该阅读这个c++ FAQ Lite页面,它告诉你更多关于这一切的内容:

为什么不能调用mB->func(2); ?

如果你需要不同的函数B也许看看virtual函数和类继承