0

Qt: неопределенная ссылка на vtable

12

Проблема с компиляцией в 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 ответ(ов)

0

Чтобы MOC (метаобъектный компилятор) мог выполнить свою задачу, он должен знать о вашем файле communicate.h (а также о любых других классах, помеченных макросом Q_OBJECT). Если вы не добавите их в секцию HEADERS вашего .pro файла, вы получите ошибку "undefined reference". Убедитесь, что все необходимые заголовочные файлы указаны в секции HEADERS вашего проекта, чтобы избежать этой проблемы.

0

Это тонкая ошибка (и, вероятно, частично также ошибка компилятора), которую я уже видел раньше. Поскольку у QWidget есть виртуальный деструктор, компилятору нужна таблица виртуальных функций (vtable) для вашего класса. Однако у вашего класса нет виртуальных функций, поэтому для вашего класса Communicate таблица не была создана.

Добавьте virtual ~Communicate() {}; в ваш класс, и все будет в порядке.

Да, мне тоже потребовалось некоторое время, чтобы это понять!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь