неопределенная ссылка на `vtable for DigitalClock '- неопределенная ссылка на` DigitalClock :: staticMetaObject' - Qt - PullRequest
3 голосов
/ 14 февраля 2012
anisha@linux-dopx:~/Desktop/notes/pomodoro> ls
timer.cpp

anisha@linux-dopx:~/Desktop/notes/pomodoro> qmake -project
anisha@linux-dopx:~/Desktop/notes/pomodoro> qmake
anisha@linux-dopx:~/Desktop/notes/pomodoro> make
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I../../../qtsdk-2010.05/qt/mkspecs/linux-g++-64 -I. -I../../../qtsdk-2010.05/qt/include/QtCore -I../../../qtsdk-2010.05/qt/include/QtGui -I../../../qtsdk-2010.05/qt/include -I. -I. -o timer.o timer.cpp
g++ -m64 -Wl,-O1 -Wl,-rpath,/home/anisha/qtsdk-2010.05/qt/lib -o pomodoro timer.o    -L/home/anisha/qtsdk-2010.05/qt/lib -lQtGui -L/home/anisha/qtsdk-2010.05/qt/lib -L/usr/X11R6/lib64 -lQtCore -lpthread 
timer.o: In function `DigitalClock::DigitalClock(QWidget*)':
timer.cpp:(.text+0x151): undefined reference to `vtable for DigitalClock'
timer.cpp:(.text+0x159): undefined reference to `vtable for DigitalClock'
timer.cpp:(.text+0x1bc): undefined reference to `DigitalClock::staticMetaObject'
timer.o: In function `main':
timer.cpp:(.text+0x2c0): undefined reference to `vtable for DigitalClock'
timer.cpp:(.text+0x2c9): undefined reference to `vtable for DigitalClock'
timer.cpp:(.text+0x30f): undefined reference to `vtable for DigitalClock'
timer.cpp:(.text+0x318): undefined reference to `vtable for DigitalClock'
collect2: ld returned 1 exit status
make: *** [pomodoro] Error 1

Мой pomodoro.pro:

######################################################################
# Automatically generated by qmake (2.01a) Tue Feb 14 10:32:09 2012
######################################################################

TEMPLATE = app
TARGET = timer
DEPENDPATH += .
INCLUDEPATH += .

# Input
SOURCES += timer.cpp

Мой timer.cpp:

#include <QLCDNumber>
#include <QtGui>
#include <QApplication>

class DigitalClock : public QLCDNumber
{
    Q_OBJECT
    public:
        DigitalClock (QWidget *parent = 0);
    private slots:
        void showTime();
};

DigitalClock :: DigitalClock (QWidget *parent) : QLCDNumber (parent)
{
    setSegmentStyle(Filled);

    QTimer *timer = new QTimer(this);
    connect (timer, SIGNAL(timeout()), this, SLOT(showTime()));
    timer->start (1000);

    showTime();

    setWindowTitle (tr ("Digital Clock"));
    resize (150, 60);
}

void DigitalClock :: showTime()
{
    QTime time = QTime::currentTime();
    QString text = time.toString("hh:mm");
    if ((time.second() % 2) == 0)
        text[2] = ' ';
    display(text);
}

int main (int argc, char *argv[])
{
    QApplication app(argc, argv);

    DigitalClock clock;
    clock.show();

    return app.exec();
}

Ответы [ 2 ]

8 голосов
/ 14 февраля 2012

Put

class DigitalClock : public QLCDNumber
{
    Q_OBJECT
    public:
        DigitalClock (QWidget *parent = 0);
    private slots:
        void showTime();
}; 

в отдельном заголовочном файле и включите его в cpp. не забудьте поместить имя файла заголовка в файл проекта, как это

HEADERS + = \ digitalclock.h

Макрос Q_OBJECT не будет работать в одном файле. Надеюсь, это поможет.

3 голосов
/ 06 апреля 2013

Эта ошибка в основном из-за неправильной ссылки.

  1. Проверьте, добавили ли вы все нужные заголовки в программу
  2. Проверьте файл pri
  3. Проверьте, пытались ли вы создать объект для класса, имеющего singletonobject

т.е. если вы создали одноэлементный объект, он не позволит создать объект.Пример:

//JSONDataManager class having singleton object
JSONDataManager* JSONDataManager::instance = 0;

JSONDataManager* JSONDataManager::Instance() {
    if (instance == 0) {
        instance = new JSONDataManager;
    }
    return instance;
}

//You can access its members as follows
JSONDataManager::Instance()->method();


//You cannot do as follows
JSONDataManager jsonManager;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...