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

Why isn't C++ inheritance in multiple header and source files working?

因此,经过一些研究,我一直在努力为我的继承 classes 提供单独的 class header 和源代码。以下示例是我的 classes 的简化版本。我所有的 header 都包含守卫、默认构造函数和虚拟析构函数。它们还具有变量所需的 getter 和 setter 函数。我将主要只显示变量和包含。

编译器错误在代码下方


主程序class:

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

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


文件管理器class:

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

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 声明和包含,但我不明白。按照现在的代码方式,我在 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"

我在参考行 class 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;

我在参考 class InfoMgr 行时收到此错误:public MgrBase

 error: invalid use of incomplete type ‘class MgrBase’

您的 header 包含有一个周期:

  • MainProgram.h 包括 FileMgr.h
  • FileMgr.h 包括 MgrBase.h
  • MgrBase.h 包括 MainProgram.h

您需要使用前向声明来打破这个循环。

header 文件中的规则应该是:如果你只需要声明 referencepointer 类型 X,前向声明 X 而不是包含定义它的 header。如果您声明(而不是定义)一个具有参数或 return 类型 X 值的函数,这同样适用。

如果您要访问 X 的成员或定义从 X.[=27 派生的 class,则只需包括 X 的完整定义=]

你的情况:

  • 将两个 #include 语句从 MainProgram.h 移动到 MainProgram.cpp
  • MgrBase.h
  • 中删除 #include "MainProgram.h"