qt c++ ошибка undefined reference to

429
26 августа 2017, 01:07

В отдельном заголовочном файле описываю класс сцены

scene.h
#include "mainwindow.h"
#ifndef SCENE_H
#define SCENE_H
class Scene1: public QGraphicsScene{
Q_OBJECT
public:
    Scene1(qreal x, qreal y, qreal width, qreal height, b2World *world);
   public slots: void advance(){
    };
 private:
    b2World* world;
};

#endif // SCENE_H

Подключаю в

mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
...   
... 
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
Scene1* scene;
QTimer* frametimer;
b2World* world;
};
#endif // MAINWINDOW_H

Ошибка возникает при добавлении следующей строчки в

mainwindow.cpp
 scene = new Scene1 (0,0,8,6,world);

(пишу ее в конструкторе)без нее все работает

Сама ошибка
debug/mainwindow.o: In function `ZN10MainWindowC2EP7QWidget':
E:\project\simple\test\build-qqq-Desktop_Qt_5_10_0_MinGW_32bit-        
Debug/../qqq/mainwindow.cpp:22: undefined reference to 
`Scene1::Scene1(double, double, double, double, b2World*)'
collect2.exe: error: ld returned 1 exit status

"ОЧИСТИТЬ"-"qmake"-"собрать все" я пробовал, эффект нулевой. в чем может быть проблема?

PS screenshot подсветки кода когда пишу название моего пользовательского класса в mainwindow.cpp, не могу продвинуться дальше не создав его объект(

проект.pro
QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = qqq
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += \
main.cpp \
mainwindow.cpp\
scene.h
HEADERS += \
mainwindow.h \
Box2D/Box2D.h \
scene.h
FORMS += \
mainwindow.ui
CONFIG += mobility
MOBILITY = 
win32: LIBS += -L$$PWD/./ -lBox2D
INCLUDEPATH += $$PWD/.
DEPENDPATH += $$PWD/.
win32:!win32-g++: PRE_TARGETDEPS += $$PWD/./Box2D.lib
else:win32-g++: PRE_TARGETDEPS += $$PWD/./libBox2D.a
Answer 1

У вас в .pro-файле допущена опечатка:

SOURCES += \
main.cpp \
mainwindow.cpp\
scene.h
^^^^^^^

Замените scene.h на scene.cpp в секции SOURCES.

А на данный момент ваш файл scene.cpp не участвует в компиляции, поэтому линковщик и не видит реализаций функций.

UPD:

Если вы сознательно не создаёте файл scene.cpp, тогда реализация объявленного вами конструктора класса Scene1 (как впрочем и других методов) должна быть добавлена в scene.h:

class Scene1 : public QGraphicsScene
{
    ...
    Scene1(qreal x, qreal y, qreal width, qreal height, b2World *world) :
        QGraphicsScene(x, y, width, height),
        world(world)
    { }
    ...
};

И в любом случае -- удалите упоминание scene.h из секции SOURCES в .pro-файле.

Answer 2

как минимум, в хедере mainwindow нужно сделать предварительное обьявление класса

сlass Scene1;

а в файл реализации

#include "scene1.h"
Answer 3

засунул определение класса в данном виде обратно в

mainwindow.H
сlass Scene1: public QGraphicsScene{
Q_OBJECT
public:
    Scene1(qreal x, qreal y, qreal width, qreal height, b2World *world);
   public slots: void advance();
 private:
    b2World* world;
};

в конце mainwindow.cpp определил класс,входные значения(вызовы функции коэфицента умножения), и определил виртуальную функцию таким образом

mainwindow.cpp
.....
MainWindow::~MainWindow()
{
    delete ui;
}

Scene1::Scene1(qreal x, qreal y, qreal width, qreal height, b2World *world)
    :QGraphicsScene (fromB2(x),fromB2(y),fromB2(width),fromB2(height))
{
    this->world=world;
}
void Scene1::advance(){
}
READ ALSO
Двойной вызов деструктора в qt

Двойной вызов деструктора в qt

Доброго времени суток!

301
Формирование std::tuple в C++11

Формирование std::tuple в C++11

Доброго времени суток, уважаемые

293
Не работает height css

Не работает height css

Всем приветЕсть блок меню, которое выезжает, блок лежит непосредственно в body

246
Как сделать грамотно эффект пагинации в фильтре?

Как сделать грамотно эффект пагинации в фильтре?

В общем, есть фильтр статей по годам, выглядит он следующим образом:

218