【发布时间】:2016-05-13 08:59:30
【问题描述】:
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::*)()
或:
void (B::*)()
但我希望它可以动态使用 funcTestA 指针或 funcTestB 指针。
这可能吗?
编辑:
好的,我知道我需要一个引用对象来调用这样的函数:
A* pA;
(pA->callback)();
但如果我尝试像这样使用指针变量:
(A::*callback)();
我变成了一个
“*”标记之前的预期 id 表达式
错误?
糟糕的解决方案:
https://isocpp.org/wiki/faq/pointers-to-members
改用 typedef:
typedef void (A::*aMemberFunctionPointer)();
aMemberFunctionPointer _callback = NULL;
寻找托马斯的答案以获得更好的解决方案。
【问题讨论】:
-
指向类方法的函数指针需要注意隐含的
this参数。阅读本文以了解详细信息:isocpp.org/wiki/faq/pointers-to-members -
@user4581301 谢谢这对我有很大帮助,但是如果我使用 (A::*callback)(); 为什么会出现错误? ?这个指针的名字一定要写在*后面还是我错了?
-
如果您想要具有特定签名的灵活回调类型,请使用
std::function或类似的东西。函数指针不按照您试图使它们工作的方式工作。 Member-函数指针会做你想做的事,有点,但有额外的限制,但当std::function存在时,真的没有理由使用如此原始的东西(如果你使用的是旧的工具链不支持 C++11 标准库的有boost::function和相同概念的各种其他实现。 -
关于您所看到的具体语法错误的问题,请注意 user4581301 链接的常见问题解答页面包含多个有关语法的部分,所有这些都相当于“成员函数指针的语法太以原始形式使用起来很复杂。”
标签: c++ function class pointers methods