kin*_*986 -6 c++ inheritance forward-declaration
因此,经过一些研究,我一直在努力为我的继承类分别设置类头和源代码.以下示例是我的类的缩短版本.我的所有标题都包含警卫,默认构造函数和虚拟析构函数.它们还具有变量所需的getter和setter函数.我将主要只显示变量和包含.
MainProgram.h
#include "FileMgr.h"
#include "InfoMgr.h"
class FileMgr;
class InfoMgr;
class MainProgram
{
private:
FileMgr* fileMgr;
InfoMgr* infoMgr;
public:
.
.
.
}; // !MainProgram
Run Code Online (Sandbox Code Playgroud)
MainProgram.cpp
#include "MainProgram.h"
#include <iostream>
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
FileMgr.h
#include "MgrBase.h"
class MainProgram;
class FileMgr : public MgrBase
{
public:
FileMgr(MainProgram* mainProgram);
.
.
.
};// !FileMgr
Run Code Online (Sandbox Code Playgroud)
FileMgr.cpp
#include <iostream>
#include <string>
#include "FileMgr.h"
#include "MainProgram.h"
Run Code Online (Sandbox Code Playgroud)
InfoMgr.h
#include <string>
#include "MgrBase.h"
class MainProgram;
class InfoMgr : public MgrBase
{
public:
InfoMgr(MainProgram* mainProgram);
.
.
.
}; //!InfoMgr
Run Code Online (Sandbox Code Playgroud)
InfoMgr.cpp
#include <iostream>
#include "MainProgram.h"
#include "InfoMgr.h"
Run Code Online (Sandbox Code Playgroud)
所以我试图弄清楚类声明和包含,但我没有得到它.通过代码现在的方式,我在InfoMgr类之后的'{'上得到了这个错误:public MgrBase:
error: expected class-name before ‘{’ token
Run Code Online (Sandbox Code Playgroud)
如果我使InfoMgr.h看起来像
#include <string>
//Class Foward Declarations
class MainProgram;
class MgrBase;
Run Code Online (Sandbox Code Playgroud)
和InfoMgr.cpp看起来像
#include <iostream>
#include "MainProgram.h"
#include "InfoMgr.h"
#include "MgrBase.h"
Run Code Online (Sandbox Code Playgroud)
我在引用行类InfoMgr:public MgrBase时遇到此错误
error: invalid use of incomplete type ‘class MgrBase’
Run Code Online (Sandbox Code Playgroud)
如果我这样做,InfoMgr.cpp不包含MgrBase并使它成为如此InfoMgr.h如下所示:
#include <string>
#include "MgrBase.h"
//Class Forward Declarations
class MainProgram;
class MgrBase;
Run Code Online (Sandbox Code Playgroud)
我在引用行类InfoMgr:public MgrBase时遇到此错误
error: invalid use of incomplete type ‘class MgrBase’
Run Code Online (Sandbox Code Playgroud)
您的标题包含中有一个循环:
MainProgram.h 包括 FileMgr.hFileMgr.h 包括 MgrBase.hMgrBase.h 包括 MainProgram.h您需要使用前向声明来中断此循环.
头文件中的规则应该是:如果您只需要声明引用或指向类型的指针X,则转发声明X而不是包括定义它的头.如果您声明(未定义)具有参数或返回值类型的函数,则同样适用X.
您只需要包含完整定义,X如果您正在访问的成员X或定义派生自的类X.
在你的情况下:
#include语句都MainProgram.h移到MainProgram.cpp#include "MainProgram.h"从中移除MgrBase.h| 归档时间: |
|
| 查看次数: |
140 次 |
| 最近记录: |