为什么多个头文件和源文件中的C++继承不起作用?
Why isn't C++ inheritance in multiple header and source files working?
因此,经过一些研究,我一直在努力为我的继承类拥有单独的类标头和源代码。以下示例缩短了我的课程的版本。我所有的标题都包括警卫,默认的构造函数和虚拟破坏者。它们还可以根据需要的变量具有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"
相关文章:
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- C++继承更改成员
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 关于C++中具有多重继承"this"指针的说明
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 如何在QT Creator上将QWidget声明为继承类的对象