变量的不完全类型-尽管我认为我已经正确地向前声明了

Incomplete Type For a Variable - Though I Thought I Had Forward Declared Correctly?

本文关键字:正确地 声明 类型 不完全 管我 变量      更新时间:2023-10-16

在尝试通过引用将此类传递到另一个类之前编译的代码。你可以忽略我使用QT的事实。

为了完整性,我添加了所有受影响的文件。

所以我觉得我已经掌握了远期申报的窍门。以下是我得到的错误,表明编译器对前向声明不满意:

error: field m_systemController has incomplete type
           SystemController m_systemController;

你可以在底部看到它吓坏了的变量。cpp:

这是启动。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;
    };
}

这是启动的开始。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
    {
    }

datatest.h中,您有以下成员变量

SystemController m_systemController;

由于变量是实例,您需要一个完整的include,而不仅仅是一个正向声明。

只有在只有指针或引用(如)的情况下,才能使用正向声明

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

您还可以使用带有前向包含的智能指针

std::unique_ptr<SystemController> m_pSystemController;