对vtable的未定义引用(相同的问题,几乎没有区别)

问题描述 投票:1回答:1

我已经在网上搜索了此问题,发现了一堆类似的问题,但是我无法完全按照我的代码来解决所有这些信息。我是一个初学者。

我正在获取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(){    
}
c++ qt-creator
1个回答
0
投票

经过大约一个月的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宏的范围正确。

© www.soinside.com 2019 - 2024. All rights reserved.