C++ C++;从多个不同类调用函数指针

C++ C++;从多个不同类调用函数指针,c++,function,class,pointers,methods,C++,Function,Class,Pointers,Methods,x 你好, 我想在我的GUI按钮类中创建一个函数调用指针 非常灵活,我可以从多个不同的类调用函数: class A { void funcTestA(); }; class B { void funcTestB(); }; class X { void (*_callback)(int); //In one X object is the funcTestA() pointer saved and in another X object the funcTestB() p

x

你好,

我想在我的GUI按钮类中创建一个函数调用指针 非常灵活,我可以从多个不同的类调用函数:

class A
{
    void funcTestA();
};
class B
{
    void funcTestB();
};
class X
{
    void (*_callback)(int); //In one X object is the funcTestA() pointer saved and in another X object the funcTestB() pointer
    void callThem();
};
void X::callThem()
{
    this->_callback();
}
这给了我一个错误,我需要类似的东西:

void (A::*)()
A* pA;
(pA->callback)();
(A::*callback)();
或:

但我希望它可以动态使用funcTestA指针或funcTestB指针

这可能吗

编辑:

好的,我知道我需要一个引用对象来调用函数,如下所示:

void (A::*)()
A* pA;
(pA->callback)();
(A::*callback)();
但是如果我试着像这样使用指针变量:

void (A::*)()
A* pA;
(pA->callback)();
(A::*callback)();
我成了一名医生

“*”标记之前应为id表达式

错误

糟糕的解决方案:

请改用typedef:

typedef  void (A::*aMemberFunctionPointer)();
aMemberFunctionPointer _callback = NULL;
寻找更好的解决方案。

但我希望它可以动态使用funcTestA指针或funcTestB指针

这可能吗

您可以使用std::函数存储回调,并使用lambda绑定到实例。看

您必须确保调用回调时回调中使用的实例仍然有效

#include <iostream>
#include <functional>

struct A
{
    void funcTestA() { std::cout << "A" << std::endl; }
};
struct B
{
    void funcTestB()  { std::cout << "B" << std::endl; }
};

struct X
{
    void setCallback( std::function<void(void)> callback ){ _callback = callback; }
    void callThem() { _callback(); } 

    std::function<void(void)> _callback;
};


int main()
{
    X xa;
    X xb;
    
    {
         A a;
         B b;
    
         xa.setCallback( [&](){ a.funcTestA(); } );
         xb.setCallback( [&](){ b.funcTestB(); } );
    
         // callbacks ok
         xa.callThem();
         xb.callThem();
    }
    // here callbacks undefined as A and B are destroyed
}
#包括
#包括
结构A
{

void funcTestA(){std::cout请发布一个。指向类方法的函数指针需要知道隐含的
参数。请阅读此参数以了解详细信息:@user4581301谢谢这对我帮助很大,但是如果使用(a::::*回调)为什么会出现错误();?此指针的名称必须写在*后面,否则我错了吗?如果您想要一个具有特定签名的灵活回调类型,请使用
std::function
或类似的方法。函数指针的工作方式与您试图使其工作的方式不同。成员函数指针将执行您想要的操作,有一定的限制,但当
std::function
存在时,真的没有理由使用如此原始的东西(如果您使用的是不支持C++11标准库的旧工具链,则有
boost::function
和相同概念的各种其他实现)。至于您所看到的特定语法错误的问题,请注意,user4581301链接的FAQ页面包含多个关于语法的部分,所有这些都相当于“成员函数指针的语法太复杂,无法以原始形式使用。”