c++ - 如何使用c++类的方法作为回调函数

标签 c++ qt callback

我想在 Qt 的另一个类中使用一个类的方法作为回调函数。这就是我想要做的:

Class A: public QObject     
Q_OBJECT

public:
    virtual void callBackFunc() = 0;
}

Class B: public A {

public:
    B();
    ~B();

    void callBackFunc() {
        emit signal1();
    }
}

Class C : public QObject {
Q_OBJECT

private:
    A* m_b;

public:
    C() {
        m_b = new B();
    }
    ~C();
    void func() {
         otherFunc(1,2,m_b->callBackFunc); // An API provided by an external library: otherFunc(int,int,void (*function)(void));
    }
}

以上代码无法编译。它抛出以下错误:

cannot convert 'A::callBackFunc' from type 'void (A::)()' to type 'void (*)()

如何在 otherFunc() 中的类 C 的 func() 方法中调用 callBackFunc?

最佳答案

如果您的 API 使用 void (*function)(void) , 你不能给它传递 void (*A::function)(void) .

第一个是函数,第二个是类方法(需要使用对象)。此处只能使用静态类方法(类似于函数)。

或者,您可以使用全局静态变量来识别 callBackFunc 所在的对象必须被调用。 但是要非常小心(不能递归或从不同的线程调用 C::func...)。

static B* objectToCallFuncOn = NULL;
void globalFunc()
{
    assert( objectToCallFuncOn );
    objectToCallFuncOn->callBackFunc();
}

void C::func() 
{
     objectToCallFuncOn = m_b;
     otherFunc(1,2,&globalFunc);
     objectToCallFuncOn = NULL;
}

关于c++ - 如何使用c++类的方法作为回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33784719/

相关文章:

c++ - 使用 getline() 而不设置 failbit

android - Android Studio 上的 Qt

android - Android蓝牙低功耗回调(LeScanCallBack)在单独的线程上?

node.js - 为什么在快速路由中调用 next() 是可选的?

c++ - 如何递归使用typedef?

c++ - 与 C++ 静态库的链接问题

c++ - Qt QTimeLine 跳过第一帧

c++ - 我想隐藏QTableWidget中的行号列

c++ - 如何为模板回调参数强制执行特定签名

c++ - 为什么 rand() 给出相对接近的数字?