Код, скомпилированный до того, как я попытался передать этот класс ссылкой в другой класс. Вы можете игнорировать тот факт, что я использую QT.
Я добавил все файлы, затронутые для полноты.
Поэтому я подумал, что у меня есть передовые декларации. Вот ошибка, которую я получаю, что указывает, что компилятор недоволен выражением о переходе:
error: field m_systemController has incomplete type
SystemController m_systemController;
Вы можете видеть переменную, которую она изматывает в нижней части.cpp:
Это startup.h:
#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;
};
}
Это начало startup.cpp:
#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 this part I'm having trouble with
m_setupTabVm(new SetupTabViewManager(this,
m_setupTab,
m_systemController,
Provider::getSettingsAsSingleton() ))
Затем я просто передаю это значение в свой файл 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:
#include "datatest.h"
#include "Model/systemcontroller.h"
namespace GUI
{
DataTest::DataTest(QObject *parent,
SystemController& sysCtrl) :
QObject(parent),
m_systemController(sysCtrl) // FREAKS OUT HERE
{
}
В datatest.h
вас есть следующая переменная-член
SystemController m_systemController;
Поскольку переменная - это экземпляр, вам нужно включить полный include, а не просто объявление вперед.
Вы можете уйти с объявлением вперед, если у вас есть только указатели или ссылки, например
SystemController* m_pSystemController; // pointer
SystemController& m_rSystemController; // reference
Вы также можете использовать интеллектуальные указатели с форвардами
std::unique_ptr<SystemController> m_pSystemController;