从另一个静态函数调用 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”。
所以我在 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”。