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;
寻找托马斯的答案以获得更好的解决方案。
答案 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
}