2014-09-18 2 views
0

이 클래스를 참조로 다른 클래스에 전달하기 전에 코드가 컴파일되었습니다. 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 
    { 
    } 
+0

당신은 참조 또는 포인터를 만들 수 있습니다 포함 앞으로 선언 된 유형에는 사용할 수 있지만 이러한 유형의 필드는 만들 수 없습니다. – dasblinkenlight

+0

"Incomplete type"은 * 선언되었지만 * 정의되지 않았 음을 의미합니다. 정의가 없으면 제한된 방법으로 만 사용할 수 있습니다. –

답변

4

는 다음과 같은 한 멤버 변수

SystemController m_systemController; 

변수는 포함하지 단지 앞으로 선언을 풀 필요인스턴스입니다.

만 포인터 또는 참조가 경우에만 또한 앞으로 스마트 포인터를 사용할 수 있습니다

SystemController* m_pSystemController; // pointer 
SystemController& m_rSystemController; // reference 

처럼 앞으로 선언으로 도망 갈 수는

std::unique_ptr<SystemController> m_pSystemController; 
+0

감사합니다. 정중하게도 설명했습니다. – fiz

관련 문제