在我尝试通过引用将此类传递到另一个类之前编译的代码。你可以忽略我使用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's 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
{
}
答案 0 :(得分:4)
在datatest.h
中,您有以下成员变量
SystemController m_systemController;
由于变量是实例,您需要一个完整的包含,而不仅仅是一个前向声明。
如果只有指针或引用,只能使用前向声明,例如
SystemController* m_pSystemController; // pointer
SystemController& m_rSystemController; // reference
您还可以使用带有转发包含的智能指针
std::unique_ptr<SystemController> m_pSystemController;