Qt: неопределенная ссылка на vtable
Проблема с компиляцией в Qt: "undefined reference to vtable for Communicate"
Я начинающий программист на Qt и использую Code::Blocks для разработки. Я создал три файла: communicate.h
, communicate.cpp
и main.cpp
. Вот содержимое файлов:
communicate.h
#ifndef COMMUNICATE_H
#define COMMUNICATE_H
#include <QWidget>
#include <QApplication>
#include <QPushButton>
#include <QLabel>
class Communicate : public QWidget
{
Q_OBJECT
public:
Communicate(QWidget *parent = 0);
private slots:
void OnPlus();
void OnMinus();
private:
QLabel *label;
};
#endif
communicate.cpp
#include "communicate.h"
Communicate::Communicate(QWidget *parent)
: QWidget(parent)
{
QPushButton *plus = new QPushButton("+", this);
plus->setGeometry(50, 40, 75, 30);
QPushButton *minus = new QPushButton("-", this);
minus->setGeometry(50, 100, 75, 30);
label = new QLabel("0", this);
label->setGeometry(190, 80, 20, 30);
connect(plus, SIGNAL(clicked()), this, SLOT(OnPlus()));
connect(minus, SIGNAL(clicked()), this, SLOT(OnMinus()));
}
void Communicate::OnPlus()
{
int val = label->text().toInt();
val++;
label->setText(QString::number(val));
}
void Communicate::OnMinus()
{
int val = label->text().toInt();
val--;
label->setText(QString::number(val));
}
main.cpp
#include "communicate.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Communicate window;
window.setWindowTitle("Communicate");
window.show();
return app.exec();
}
Однако при сборке проекта возникает ошибка, связанная с vtable
:
undefined reference to `vtable for Communicate'
Первоначально, у меня уже есть реализация всех необходимых методов в классе Communicate
, но ошибка все еще появляется.
Кто-нибудь может помочь мне разобраться с этой проблемой? Я не могу понять, в чем причина.
2 ответ(ов)
Чтобы MOC (метаобъектный компилятор) мог выполнить свою задачу, он должен знать о вашем файле communicate.h (а также о любых других классах, помеченных макросом Q_OBJECT). Если вы не добавите их в секцию HEADERS вашего .pro файла, вы получите ошибку "undefined reference". Убедитесь, что все необходимые заголовочные файлы указаны в секции HEADERS вашего проекта, чтобы избежать этой проблемы.
Это тонкая ошибка (и, вероятно, частично также ошибка компилятора), которую я уже видел раньше. Поскольку у QWidget есть виртуальный деструктор, компилятору нужна таблица виртуальных функций (vtable) для вашего класса. Однако у вашего класса нет виртуальных функций, поэтому для вашего класса Communicate таблица не была создана.
Добавьте virtual ~Communicate() {};
в ваш класс, и все будет в порядке.
Да, мне тоже потребовалось некоторое время, чтобы это понять!
Как удалить элемент из std::vector<> по индексу?
`unsigned int` против `size_t`: когда и что использовать?
Какова разница между "new", "malloc" и "calloc" в C++?
Что означает && в конце сигнатуры функции (после закрывающей скобки)?
Инициализация std::string из char* без копирования