我已经在网上搜索了此问题,发现了一堆类似的问题,但是我无法完全按照我的代码来解决所有这些信息。我是一个初学者。
我正在获取undefined reference to vtable for Character error
。下面的代码。
Character.h:
#ifndef CHARACTER_H_
#define CHARACTER_H_
#include "ZorkUL.h"
#include <QObject>
#include <string>
using namespace std;
#include <vector>
using std::vector;
class Character : public QObject {
Q_OBJECT
private:
int health;
int stamina;
public:
Character();
void setHealth(void);
void setStamina(void);
signals:
void listener();
};
#endif /*CHARACTER_H_*/
Character.cpp:
#include "Character.h"
Character::Character() {
this->health = 100;
this->stamina = 100;
}
void Character::setHealth(void){
this->health = health - 10;
}
void Character::setStamina(void){
this->stamina = stamina - 10;
}
void Character::listener(){
}
经过大约一个月的Google筛选以找到该问题的答案之后,我终于才能够解决它。
[大多数答案将告诉您删除构建目录,或再次运行qmake
,依此类推,其背后的想法(高度简化)是QT的Meta Object Compiler为具有.cpp
的类生成了其他Q_OBJECT
文件]宏的类声明中,有时在将使用Q_OBJECT
宏的其他文件添加到项目后,有时可以“忘记”生成这些文件。
虽然在大多数情况下是正确的,但为我解决问题的方法发生在最终我自己检查了mainwindow_moc.cpp
文件之后。
发现我导入到项目中的外部Qt小部件(此后已停止使用,但忘了从项目中取出源文件)有一些名称空间声明和using
语句,这似乎使MOC感到困惑生成我的mainwindow_moc.cpp
文件时。
结果,MOC生成了我的MainWindow函数,该函数的作用域位于此额外的小部件名称空间下,并且生成的代码看起来像extra_namespace::MainWindow::staticMetaObject
,而不是MainWindow::staticMetaObject
。
所以对我来说,解决方案是简单地从我的.pro
文件中删除该小部件,并删除所有这些头文件的#include
指令。
因此,如果第一种解决方案不适合您,即删除构建目录并手动运行qmake
。请查看您的构建目录中生成的classname_moc.cpp
文件,并确保需要生成的功能Q_OBJECT
宏的范围正确。