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

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

本文关键字:C++ 继承 不起作用 源文件 文件 为什么      更新时间:2023-10-16

因此,经过一些研究,我一直在努力为我的继承类拥有单独的类标头和源代码。以下示例缩短了我的课程的版本。我所有的标题都包括警卫,默认的构造函数和虚拟破坏者。它们还可以根据需要的变量具有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"