为什么多个头文件和源文件中的C++继承不起作用?

kin*_*986 -6 c++ inheritance forward-declaration

因此,经过一些研究,我一直在努力为我的继承类分别设置类头和源代码.以下示例是我的类的缩短版本.我的所有标题都包含警卫,默认构造函数和虚拟析构函数.它们还具有变量所需的getter和setter函数.我将主要只显示变量和包含.

编译器错误位于代码下方的底部


MainProgram类:

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类(基类):

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类:

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类:

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)

Rei*_*ica 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