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

时间:2017-03-10 10:59:50

标签: 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

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"


我尝试了什么以及他们的错误:

所以我试图弄清楚类声明和包含,但我没有得到它。随着代码现在的方式,我在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"

我在引用行类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;

我在引用行类InfoMgr:public MgrBase

时遇到此错误
 error: invalid use of incomplete type ‘class MgrBase’

1 个答案:

答案 0 :(得分: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