Russian Qt Forum
Ноябрь 22, 2024, 23:06 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не могу понять связи виртуальных таблиц и класса потока (Решено)  (Прочитано 4089 раз)
Eten
Гость
« : Июль 25, 2013, 07:09 »

Всем доброго дня.

У меня такая проблема. Написал сам от руки, пример из книжки Шлее про потоки. У него работает из прилагающегося примера к книге, а меня вылазиет ошибка: undefined reference to `vtable for MyThread'

Не понимаю, причем тут виртуальные таблицы, когда метод run переопределен.

И да, кстати, когда создавал объект класса MyThread без указателей, ошибка описанная выше вылезла не один раз, а целых три.

Что я сделал не так?! Вроде, все правильно написал.  Непонимающий

Привожу код main.cpp:
Код:
#include <QApplication>
#include <QtGui>

class MyThread : public QThread {
Q_OBJECT
private:
    int m_nValue;

public:
    MyThread() : m_nValue(10)
    {
    }

protected:
    void run()
    {
        QTimer timer;
        connect(&timer, SIGNAL(timeout()), SLOT(slotNextValue()));
        timer.start(1000);

        exec();
    }

signals:
    void finished    (   );
    void currentValue(int);

public slots:
    void slotNextValue()
    {
        emit currentValue(--m_nValue);

        if (!m_nValue) {
            emit finished();
        }

    }
};


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

    MyThread *m = new MyThread();

    m->start();

    return app.exec();
}
« Последнее редактирование: Июль 25, 2013, 12:05 от Eten » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Июль 25, 2013, 07:12 »

Переместите класс в h файл  Улыбающийся
« Последнее редактирование: Июль 25, 2013, 07:27 от gil9red » Записан

Fat-Zer
Гость
« Ответ #2 : Июль 25, 2013, 08:46 »

или в конец допиши #include "main.moc"
Записан
Bepec
Гость
« Ответ #3 : Июль 25, 2013, 08:50 »

Аплодисменты сотен поклонников иных IDE, чем QtCreator, аплодируют ногами, стоя на голове, предыдущему комментарию и желают ему больше не раскидывать такие ценные слова.

Update: Ok, Константин. Просто напоминает мне этот совет про один проект, над переводом которого в удобочитаемый и компилируемый вид я занимался месяцок.
« Последнее редактирование: Июль 25, 2013, 10:02 от Bepec » Записан
Eten
Гость
« Ответ #4 : Июль 25, 2013, 09:13 »

Спасибо, сработало.

А можно еще вопрос. Я этот пример стал пробовать, когда столкнулся с такой же проблемой у себя в программе. Изначально у меня был класс потока MyThread в h файле класса RILFeniksEngine, в котором я его собирался использовать. В том h файле он был прописан, как в коде первого поста, а другой класс RILFeniksEngine был описан без кода методов, код методов я прописал в cpp файле. И у меня сработала такая же ошибка.

Когда я вынес класс потока MyThread в отдельный h файл, без всяких cpp файлов к нему, и подключил его к h файлу упомянутому выше класса RILFeniksEngine, все заработало.

Вот так у меня было изначально h файл, о котором говорилось ранее (все методы класса RILFeniksEngine прописаны в cpp файле):
Код:
#ifndef NENGINE_H
#define NENGINE_H

#include <QThread>
#include <QTimer>
#include <QObject>

#include "subsystemsoftheengine.h" //этот файл подключает файлы подсистем в класса RILFeniksEngine, и никак не влияет на класс потока по данной теме

class MyThread : public QThread {
Q_OBJECT
private:
    int m_nValue;

public:
    MyThread() : m_nValue(10)
    {
    }

    void run()
    {
        QTimer timer;
        connect(&timer, SIGNAL(timeout()), SLOT(slotNextValue()));
        timer.start(1000);

        //exec();
    }

signals:
    void finished    (   );
    void currentValue(int);

public slots:
    void slotNextValue()
    {
        emit currentValue(--m_nValue);

        if (!m_nValue) {
            emit finished();
        }

    }
};

class RILFeniksEngine
{

public:
    RILFeniksEngine();

    ~RILFeniksEngine();

    //Запуск игры
    void Run();

    //Вывод текста экрана
    QString GetScreen(int indexScreen = 0);


    //Загрузка данных игры в проигрыватель
    void LoadGame(QString PathFile);

private:

    //Подсистема работы со стеком
    RFSubsystemStack* ptSubsystemStack;

    //Подсистема выполнения команд
    RFSubsystemCommandsExecution* ptSubsystemCommandsExecution;

    //Подсистема областей данных
    RFSubsystemDataArea* ptSubsystemDataArea;

    //Подсистема экранов
    RFESubsystemScreens* ptSubsystemScreens;

    //Статус выполнения игры
    RFStatusGameExecution* theStatusGameExecution;

    //Тот самый объект класса потока
    MyThread  *m;
};

#endif // NENGINE_H

Объект m класса MyThread, создаю в конструкторе и там же его запускаю, ровно также как и все подобные ему объекты.

А из-за чего не работает, когда я так прописывал, как было указано в изначальном варианте кода, так и не понял.  Непонимающий
Записан
ритт
Гость
« Ответ #5 : Июль 25, 2013, 09:45 »

Аплодисменты сотен поклонников иных IDE, чем QtCreator, аплодируют ногами, стоя на голове, предыдущему комментарию и желают ему больше не раскидывать такие ценные слова.
будьте более конструктивны в своих комментариях. сарказм не по существу пользы не несёт.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.137 секунд. Запросов: 23.