Неопределенная ссылка на vtable (та же старая проблема, мало различий) - PullRequest
1 голос
/ 16 марта 2020

Я искал в Интернете это и обнаружил похожую проблему, но не могу решить ее с помощью своего кода, следуя всей этой информации. Я абсолютный новичок.

Я получаю 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(){    
}

1 Ответ

0 голосов
/ 19 марта 2020

Спустя примерно месяц просеивания в Google, чтобы найти ответ на этот вопрос, я, наконец, только что смог решить его.

Большинство ответов скажут вам удалить каталог сборки или запустить qmake снова и так далее, и идея этого (очень упрощенного) заключается в том, что мета-компилятор QT генерирует дополнительные файлы .cpp для классов с макросом Q_OBJECT в своем объявлении класса, и иногда может "забыть" сгенерировать эти файлы когда в проект были добавлены дополнительные файлы, использующие макрос Q_OBJECT.

Хотя в большинстве случаев это верно, решение проблемы для меня произошло после finally проверки mainwindow_moc.cpp подать сам.

Пришел, чтобы узнать, что внешний виджет Qt, который я импортировал в свой проект (и с тех пор прекратил использовать, но забыл извлечь исходные файлы из моего проекта), имел некоторые объявления пространства имен и операторы using, которые казались чтобы запутать MO C при создании моего mainwindow_moc.cpp файла.

В результате MO C сгенерировал мои функции MainWindow, ограниченные этим пространством имен дополнительного виджета, и сгенерированный код, который выглядел как extra_namespace::MainWindow::staticMetaObject вместо MainWindow::staticMetaObject.

Поэтому для меня было просто удалить этот виджет из моего файла .pro и все директивы #include для этих заголовочных файлов.

Так что, если первое решение не работает для вас, то есть удаление каталога сборки и запуск qmake вручную ... посмотрите на файлы classname_moc.cpp, сгенерированные в вашем каталоге сборки, и убедитесь, что сгенерированные функции, необходимые для макроса Q_OBJECT, имеют правильную область видимости.

...