이 클래스를 참조로 다른 클래스에 전달하기 전에 코드가 컴파일되었습니다. QT를 사용하고 있다는 사실을 무시할 수 있습니다.변수에 대한 불완전한 유형 - 앞으로 내가 올바로 선언했음을 알았지 만?
나는 완전성을 위해 영향을받는 모든 파일을 추가했습니다.
그래서 전방 선언문이 붙어 있다고 생각했습니다.
이가있다 : 당신은 그것을 바닥 .CPP에 걸쳐 괴물 변수를 볼 수 있습니다
error: field m_systemController has incomplete type
SystemController m_systemController;
다음은 컴파일러를 나타냅니다 내가지고있어 오류가 앞으로 선언에 대한 행복하지입니다 startup.h :
#include "startup.h"
#include "View/setuptab.h"
#include "View/cbcregisterstab.h"
#include "View/datatesttab.h"
#include "View/mainview.h"
#include "Model/settings.h"
#include "Model/systemcontroller.h"
#include "Model/datatest.h"
#include "ViewMgr/setuptabviewmanager.h"
#include "provider.h"
namespace GUI
{
Startup::Startup() :
QObject(nullptr),
m_setupTab(*new SetupTab(nullptr)),
m_regTab(*new CbcRegistersTab(nullptr)),
m_dataTab(*new DataTestTab(nullptr)),
m_mainView(*new MainView(nullptr,
m_setupTab,
m_regTab,
m_dataTab)),
m_systemController(*new SystemController(nullptr,
Provider::getSettingsAsSingleton())),
m_dataTest(*new DataTest(nullptr,
m_systemController)), //so it's this part I'm having trouble with
m_setupTabVm(new SetupTabViewManager(this,
m_setupTab,
m_systemController,
Provider::getSettingsAsSingleton()))
난 후 아주 :이 startup.cpp의 시작은
#pragma once
#include <QObject>
namespace GUI{
class SetupTab; //Should have my forward declarations in order
class CbcRegistersTab;
class DataTestTab;
class MainView;
class Settings;
class SystemController;
class DataTest;
class SetupTabViewManager;
class Startup : public QObject
{
Q_OBJECT
public:
explicit Startup();
void show() const ;
~Startup();
private:
SetupTab& m_setupTab;
CbcRegistersTab& m_regTab;
DataTestTab& m_dataTab;
MainView& m_mainView;
Settings* m_settings;
SystemController& m_systemController;
DataTest& m_dataTest;
SetupTabViewManager* m_setupTabVm;
explicit Startup(const Startup& rhs) = delete;
Startup& operator= (const Startup& rhs) = delete;
};
}
단순히 내 datatest.h에이 값을 통해 전달하고 참조를 통해 변수에 넥타이 :
#pragma once
#include <QObject>
namespace GUI{
class SystemController;
class DataTest : public QObject
{
Q_OBJECT
public:
explicit DataTest(QObject *parent,
SystemController& sysCtrl);
void runTest();
private:
SystemController m_systemController;
explicit DataTest(const DataTest& rhs) = delete;
DataTest& operator= (const DataTest& rhs) = delete;
};
}
그런 다음 datatest.cpp의 상단 : datatest.h
에서
#include "datatest.h"
#include "Model/systemcontroller.h"
namespace GUI
{
DataTest::DataTest(QObject *parent,
SystemController& sysCtrl) :
QObject(parent),
m_systemController(sysCtrl) // FREAKS OUT HERE
{
}
당신은 참조 또는 포인터를 만들 수 있습니다 포함 앞으로 선언 된 유형에는 사용할 수 있지만 이러한 유형의 필드는 만들 수 없습니다. – dasblinkenlight
"Incomplete type"은 * 선언되었지만 * 정의되지 않았 음을 의미합니다. 정의가 없으면 제한된 방법으로 만 사용할 수 있습니다. –