来自多个不同类的C ++调用函数指针

时间:2016-02-03 22:52:23

标签: c++ function class pointers methods

X

您好,

我想在我的GUI Button Class中创建一个函数调用指针 是如此灵活,我可以从多个不同的类调用函数:

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::*)()

或:

void (B::*)()

但是我希望它能动态地使用funcTestA指针或funcTestB指针。

这甚至可能吗?

修改

好的我知道我需要一个引用Object来调用这个函数:

A* pA;
(pA->callback)();

但是如果我尝试使用像这样的指针var:

(A::*callback)();

我成了

  

预期的id-expression在' *'之前令牌

错误?

BAD SOLUTION:

https://isocpp.org/wiki/faq/pointers-to-members

请改用typedef:

typedef  void (A::*aMemberFunctionPointer)();
aMemberFunctionPointer _callback = NULL;

寻找托马斯的答案以获得更好的解决方案。

1 个答案:

答案 0 :(得分:0)

  

但是我希望它能动态地使用funcTestA指针或funcTestB指针。

     

这甚至可能吗?

您可以使用std :: function存储回调和lambdas以绑定到实例。请参阅live example here

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

#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
}