C++ 变量的类型不完整-尽管我认为前向声明正确?
在我尝试通过引用将该类传递到另一个类之前编译的代码。你可以忽略我使用QT的事实 为了完整性,我添加了所有受影响的文件 所以我认为我已经掌握了前进宣言的诀窍。下面是我得到的错误,它表明编译器对转发声明不满意:C++ 变量的类型不完整-尽管我认为前向声明正确?,c++,forward-declaration,C++,Forward Declaration,在我尝试通过引用将该类传递到另一个类之前编译的代码。你可以忽略我使用QT的事实 为了完整性,我添加了所有受影响的文件 所以我认为我已经掌握了前进宣言的诀窍。下面是我得到的错误,它表明编译器对转发声明不满意: error: field m_systemController has incomplete type SystemController m_systemController; 您可以在底部看到它所扭曲的变量。cpp: 这是启动。h: #pragma once #in
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系统控制器;
您可以对前向声明的类型进行引用或指针,但不能创建这些类型的字段。“不完整类型”表示它已声明,但尚未定义。它只能在没有定义的情况下以有限的方式使用。您可以对前向声明的类型进行引用或指针,但不能生成这些类型的字段。“不完整类型”表示它已声明,但尚未定义。它只能以有限的方式使用,没有定义。谢谢,很好地解释了牙链,也很好地解释了