【问题标题】:C++ Call function pointer from multiple different Classes来自多个不同类的 C++ 调用函数指针
【发布时间】: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


【解决方案1】:

但我希望它可以动态使用 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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多