【问题标题】:Why isn't C++ inheritance in multiple header and source files working?为什么多个头文件和源文件中的 C++ 继承不起作用?
【发布时间】:2017-03-10 10:59:50
【问题描述】:

因此,经过一些研究,我一直在努力为我的继承类提供单独的类头和源代码。以下示例是我的课程的缩短版本。我所有的头文件都包含守卫、默认构造函数和虚拟析构函数。它们还具有变量所需的 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 类:

文件管理器.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’

【问题讨论】:

  • 请创建一个minimal reproducible example,最好在一些在线编译器上,这样我们才能真正看到问题
  • 我们不想要“更多”;我们想要一个 minimal 示例,如帮助中心和 Vittorio 给您的链接后面所述。代码太多了;你还没有缩小问题的范围。解构问题是我们工作中的一项关键技能,所以你会很高兴我们让你学会了它!
  • 你也没有说在哪里你得到这些错误,你的代码文件不完整。
  • 好吧,构造一个minimal reproducible example,如果构造一个不能告诉你问题是什么,那么我们可以继续。
  • 它不是minimal reproducible example。请点击链接并阅读页面。我不只是故意迟钝-您必须学习如何解构问题,并且我正在尝试帮助您学习编写好的 SO 问题,以便您将来可以获得更好的帮助(以及更少的反对票,这将最终导致问题禁令!)

标签: c++ inheritance forward-declaration


【解决方案1】:

您的标题包含中有一个循环:

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

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

头文件中的规则应该是:如果你只需要声明一个类型Xreferencepointer,转发声明X而不是包含定义它的标题。如果您声明(而不是定义)具有X 类型的参数或返回值的函数,这同样适用。

如果您要访问X 的成员或定义派生自X 的类,则只需包含X 的完整定义。

在你的情况下:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 2015-04-23
    • 1970-01-01
    相关资源
    最近更新 更多