从另一个静态函数调用 class 成员函数时未定义的引用

Undefined reference when calling a class member function from another static function

所以我在 C++ 中有一个静态函数,需要调用一个 class 的成员函数。显然,如果不指定成员函数所属的 class 的实例,就不能从静态方法中调用成员函数。在我的例子中,class 只需要实例化一次,所以我想出了以下代码:

#include <QAndroidJniObject>
#include <QDebug>

class JavaListener : public QObject{
    Q_OBJECT
public:
    JavaListener() = default;

    static JavaListener* getInstance(){
        if (mThis == nullptr) // avoid creation of new instances
            mThis = new JavaListener;
        return mThis;
    }

    static JavaListener* mThis;

signals:
    // signals can be seen as just "functions" in Qt
    void messageReceived(QString const &message);
};

JavaListener* JavaListener::mThis = nullptr;


static void receiveFromJava(JNIEnv */*env*/, jobject /*obj*/, jstring message)
{
    JavaListener* j = JavaListener::getInstance();
    QAndroidJniObject messageObject(message);
    // emit is not really necessary
    emit j->messageReceived(messageObject.toString());

    qDebug() << "MESSAGE FROM JAVA" << message;
}

但是我收到以下错误:

error: error: undefined reference to 'JavaListener::messageReceived(QString const&)'

在以下行中: emit j->messageReceived(messageObject.toString());

按照@NathanOliver 的建议,我在 JavaListener class:

中创建了一个函数
    void onMessageReceived(QString const &message){
        emit messageReceived(message);
    }

然后在我的静态方法中调用它。 (我不确定为什么不能直接发出Qt信号)。

遵循单例代码模板,不要让对象管理员成员public,它必须是私有的 所以,做这样的事情:

private: 
static JavaListener* mThis = nullptr; 

那么你可以这样做:

JavaListener::getInstance()->messageReceived(messageObject.toString());

您需要先 运行 qmake。信号元代码将由此生成,然后信号代码将在那里。然后未定义的符号问题也应该解决。

在 Qt-Creator 中只需尝试“运行 QMake”。