C++ 变量的类型不完整-尽管我认为前向声明正确?

C++ 变量的类型不完整-尽管我认为前向声明正确?,c++,forward-declaration,C++,Forward Declaration,在我尝试通过引用将该类传递到另一个类之前编译的代码。你可以忽略我使用QT的事实 为了完整性,我添加了所有受影响的文件 所以我认为我已经掌握了前进宣言的诀窍。下面是我得到的错误,它表明编译器对转发声明不满意: error: field m_systemController has incomplete type SystemController m_systemController; 您可以在底部看到它所扭曲的变量。cpp: 这是启动。h: #pragma once #in

在我尝试通过引用将该类传递到另一个类之前编译的代码。你可以忽略我使用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;
    };
}
然后,我非常简单地将该值传递到我的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.h
中有以下成员变量

SystemController m_systemController;
因为变量是一个实例,所以需要一个完整的include,而不仅仅是一个forward声明

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

SystemController* m_pSystemController;  // pointer
SystemController& m_rSystemController;  // reference
还可以将智能指针与正向包含一起使用

std::unique_ptr<SystemController> m_pSystemController;
std::唯一的ptr m系统控制器;

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

SystemController m_systemController;
因为变量是一个实例,所以需要一个完整的include,而不仅仅是一个forward声明

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

SystemController* m_pSystemController;  // pointer
SystemController& m_rSystemController;  // reference
还可以将智能指针与正向包含一起使用

std::unique_ptr<SystemController> m_pSystemController;
std::唯一的ptr m系统控制器;

您可以对前向声明的类型进行引用或指针,但不能创建这些类型的字段。“不完整类型”表示它已声明,但尚未定义。它只能在没有定义的情况下以有限的方式使用。您可以对前向声明的类型进行引用或指针,但不能生成这些类型的字段。“不完整类型”表示它已声明,但尚未定义。它只能以有限的方式使用,没有定义。谢谢,很好地解释了牙链,也很好地解释了