因此经过一些研究后,我一直在努力为我的继承类提供单独的类头和源代码。以下示例是我的类的缩短版本。我的所有标题都包含警卫,默认构造函数和虚拟析构函数。它们还具有变量所需的getter和setter函数。我将主要只显示变量和包含。
MainProgram.h
#include "FileMgr.h"
#include "InfoMgr.h"
class FileMgr;
class InfoMgr;
class MainProgram
{
private:
FileMgr* fileMgr;
InfoMgr* infoMgr;
public:
.
.
.
}; // !MainProgram
MainProgram.cpp
#include "MainProgram.h"
#include <iostream>
MgrBase.h
#include "MainProgram.h"
#include <string>
class MainProgram;
class MgrBase
{
protected:
MainProgram* mainProgram;
MgrBase() : mainProgram(nullptr) {}
virtual ~MgrBase() {}
public:
virtual bool Init() = 0;
}; // !MgrBase
FileMgr.h
#include "MgrBase.h"
class MainProgram;
class FileMgr : public MgrBase
{
public:
FileMgr(MainProgram* mainProgram);
.
.
.
};// !FileMgr
FileMgr.cpp
#include <iostream>
#include <string>
#include "FileMgr.h"
#include "MainProgram.h"
InfoMgr.h
#include <string>
#include "MgrBase.h"
class MainProgram;
class InfoMgr : public MgrBase
{
public:
InfoMgr(MainProgram* mainProgram);
.
.
.
}; //!InfoMgr
InfoMgr.cpp
#include <iostream>
#include "MainProgram.h"
#include "InfoMgr.h"
所以我试图弄清楚类声明和包含,但我没有得到它。随着代码现在的方式,我在InfoMgr类之后的'{'上得到了这个错误:public MgrBase:
error: expected class-name before ‘{’ token
如果我使InfoMgr.h看起来像
#include <string>
//Class Foward Declarations
class MainProgram;
class MgrBase;
和InfoMgr.cpp看起来像
#include <iostream>
#include "MainProgram.h"
#include "InfoMgr.h"
#include "MgrBase.h"
我在引用行类InfoMgr:public MgrBase
时遇到此错误 error: invalid use of incomplete type ‘class MgrBase’
如果我这样做,InfoMgr.cpp不包含MgrBase,那么InfoMgr.h就是这样:
#include <string>
#include "MgrBase.h"
//Class Forward Declarations
class MainProgram;
class MgrBase;
我在引用行类InfoMgr:public MgrBase
时遇到此错误 error: invalid use of incomplete type ‘class MgrBase’
答案 0 :(得分:5)
你的标题包含了一个循环:
MainProgram.h
包含FileMgr.h
FileMgr.h
包含MgrBase.h
MgrBase.h
包含MainProgram.h
您需要使用前向声明来中断此循环。
标头文件中的规则应该是:如果您只需要将引用或指针声明为类型X
,则转发声明X
而不是包括定义它的标头。如果您声明(未定义)具有类型X
的参数或返回值的函数,则同样适用。
如果您正在访问X
的成员或定义从X
派生的类,则您只需要包含X
的完整定义。
在你的情况下:
#include
语句从MainProgram.h
移至MainProgram.cpp
#include "MainProgram.h"
MgrBase.h