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

时间:2019-09-10 19:25:19

标签: c++ qt static-methods

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

#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;
}

但是我遇到以下错误:

  

错误:错误:对'JavaListener :: messageReceived(QString const&)'的未定义引用

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

3 个答案:

答案 0 :(得分:0)

根据@NathanOliver的建议,我在JavaListener类中创建了一个函数:

    void onMessageReceived(QString const &message){
        emit messageReceived(message);
    }

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

答案 1 :(得分:0)

遵循单例代码模板并且不公开对象管理者成员,它必须是私有,因此,请执行以下操作:

private: 
static JavaListener* mThis = nullptr; 

然后您可以执行以下操作:

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

答案 2 :(得分:0)

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

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