因此,经过一些研究,我一直在努力为我的继承类拥有单独的类标头和源代码。以下示例缩短了我的课程的版本。我所有的标题都包括警卫,默认的构造函数和虚拟破坏者。它们还可以根据需要的变量具有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类(基类):
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类:
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类:
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"
我尝试过的错误及其错误:
所以我尝试找出课堂声明,包括,但我没有得到。通过现在的代码的方式,我在" {'" class 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"
我会参考LINE类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;
我会参考LINE类Infomgr:public mgrbase
获得此错误 error: invalid use of incomplete type ‘class MgrBase’
您的标题包含周期:
-
MainProgram.h
包括FileMgr.h
-
FileMgr.h
包括MgrBase.h
-
MgrBase.h
包括MainProgram.h
您需要使用前瞻性声明打破此周期。
标题文件中的规则应为:如果您只需要声明参考或 pointer to type X
,则向前声明 X
,而不是包括定义它的标题。如果您要声明(不定义)具有X
类型的参数或返回值的函数。
您只需要在访问X
的成员或定义从X
的类中包含X
的完整定义。
在您的情况下:
- 将两个
#include
语句从MainProgram.h
移动到MainProgram.cpp
- 从
MgrBase.h
删除
#include "MainProgram.h"