Ошибка в QT main.cpp:(.text.startup+0xd6): undefined reference to `vtable for Counter'

302
30 мая 2017, 02:45

Пытаюсь создать тривиальное приложение на QT: от нажатий кнопки увеличивается счетчик, если увеличивается счетчик, отпечатывает текущее значение в QLabel.

Внезапная ошибка, не могу решить, что делать.

Добавлять виртуальный деструктор пробовал. Переставлять версию QT - нет еще.

О версиях:

$ qmake --version

выдает:

QMake version 3.0
Using Qt version 5.5.1 in /usr/lib/x86_64-linux-gnu

conn.pro файл содержит следующее:

TEMPLATE = app
QT += core gui
TARGET = conn
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
SOURCES += main.cpp

main.cpp файл содержит следующее:

#include <QApplication>
#include <QLabel>
#include <QPushButton>
#include <QObject>
class Counter : public QObject {
    Q_OBJECT
private:
    double i_;
public:
    virtual ~Counter()
    {
    }
    Counter() : QObject(), i_(0)
    {
    }

public slots:
    void slot_incCounter();
signals:
    void goodbye(){}
    void counterChanged(double){}
};
void Counter::slot_incCounter() {
    emit counterChanged(++i_);
    if (i_ == 5) {
        emit goodbye();
    }
}
int main(int argc, char* argv[]) {
    QApplication my_app(argc, argv);
    QLabel label1("label i created");
    label1.show();
    QPushButton button1("press me");
    button1.show();
    Counter counter1;
    QObject::connect(&button1, SIGNAL(clicked()),
                     &counter1, SLOT(slot_incCounter()));
    QObject::connect(&counter1, SIGNAL(counterChanged(double a)),
                     &label1, SLOT(setNum(double a)));
    QObject::connect(&counter1, SIGNAL(goodbye()),
                     &my_app, SLOT(quit()));
    return my_app.exec();
}

Запускаю так:

qmake && make && ./conn 

Далее вывод ошибки такой:

g++ -m64 -Wl,-O1 -o conn main.o   -L/usr/X11R6/lib64 -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread 
main.o: In function `main':
main.cpp:(.text.startup+0xd6): undefined reference to `vtable for Counter'
collect2: error: ld returned 1 exit status
Makefile:144: recipe for target 'conn' failed
make`:` *** [conn] Error 1

Как быть?

Answer 1

Что нужно было сделать:

1. Перенести Counter в файл Counter.h 2. Никогда не писать определения для signal'ов.

Рабочий код: main.cpp:

#include <QApplication>
#include "Counter.h"

int main(int argc, char* argv[]) {
    QApplication my_app(argc, argv);
    QLabel label1("1");
    label1.show();
    QPushButton button1("press me");
    button1.show();
    Counter counter1;
    QObject::connect(&button1, SIGNAL(clicked()),
                     &counter1, SLOT(slot_incCounter()));
    QObject::connect(&counter1, SIGNAL(counterChanged(double)),
                     &label1, SLOT(setNum(double)));
    QObject::connect(&counter1, SIGNAL(goodbye()),
                     &my_app, SLOT(quit()));
    return my_app.exec();
}

Counter.h:

#ifndef COUNTER_H
#define COUNTER_H
#include <QLabel>
#include <QPushButton>
#include <QObject>
class Counter : public QObject {
    Q_OBJECT
private:
    double i_;
public:
    virtual ~Counter()
    {
    }
    Counter() : QObject()
    {
    }

public slots:
    void slot_incCounter();
signals:
    void goodbye();
    void counterChanged(double);
};
#endif // COUNTER_H

Counter.cpp:

#include "Counter.h"

void Counter::slot_incCounter() {
    emit counterChanged(++i_);
    if (i_ == 5) {
        emit goodbye();
    }
}

Спасибо всем

READ ALSO
Как считать строку в цикле?

Как считать строку в цикле?

при попытке использовать getline в цикле независимо от n дает ввести строку только один разпомогите исправить

284
Проблемы с кодировкой на ideone

Проблемы с кодировкой на ideone

Как известно, ideone компилирует исходники на Си++ в utf8Однако, мне нужна строка в utf16 (wstring)

277
Как обрезать полное ФИО до инициалов в с++

Как обрезать полное ФИО до инициалов в с++

В программе предусмотрен ввод ФИОЯ не знаю как реализовать, так, что бы вводилось иванов иван иванович, а на выходе получалось Иванов И

261
Поиск объединения промежутков

Поиск объединения промежутков

Мне нужен именно алгоритм

256