类成员函数指针不兼容问题求解:跨类传递成员函数指针
问题解决方法
报错原因
类的非静态成员函数指针void (A::*)()和普通全局函数指针void (*)()类型不兼容——非静态成员函数隐含携带一个this指针参数,必须绑定到具体的类实例才能执行,而普通函数指针不需要依赖任何对象。
解决方案
根据需求,有几种可行的处理方式:
方案1:将method2_of_A改为静态成员函数
如果method2_of_A不需要访问A的非静态成员变量或函数,直接把它声明为静态成员函数,此时它的类型就会匹配void (*)():
// A类的头文件中修改声明 class A : public QMainWindow { Q_OBJECT public: void method1_of_A(void); static void method2_of_A(); // 改为静态成员函数 }; // A类的实现文件 void A::method2_of_A() { // 此处只能访问静态成员或全局资源,不能用this指针 } // 调用处修正对象名(原代码中误写为B,应是instanceB) void A::method1_of_A(void) { B instanceB; instanceB.methodB(method2_of_A); }
方案2:用std::function+lambda包装非静态成员函数
如果必须保留method2_of_A为非静态成员函数,修改B::methodB的参数为std::function<void()>,再用lambda捕获当前A的实例(this)来包装调用:
// 先修改B类的定义 #include <functional> class B { public: void methodB(std::function<void()> func) { func(); // 执行传入的函数对象 } }; // A类的调用代码修改为 void A::method1_of_A(void) { B instanceB; // lambda捕获this,包装method2_of_A的调用 instanceB.methodB([this](){ this->method2_of_A(); }); }
方案3:让methodB接受成员函数指针+对象实例
修改B::methodB为模板函数,直接接收类成员函数指针和对应的对象实例:
// B类的定义 class B { public: template<typename T> void methodB(void (T::*memberFunc)(), T* obj) { (obj->*memberFunc)(); // 通过对象实例调用成员函数 } }; // A类的调用代码 void A::method1_of_A(void) { B instanceB; instanceB.methodB(&A::method2_of_A, this); }
内容的提问来源于stack exchange,提问作者RadaD
相关产品推荐
相关产品推荐

