Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么不是';tc++;多个头文件和源文件中的继承是否有效?_C++_Inheritance_Forward Declaration - Fatal编程技术网

C++ 为什么不是';tc++;多个头文件和源文件中的继承是否有效?

C++ 为什么不是';tc++;多个头文件和源文件中的继承是否有效?,c++,inheritance,forward-declaration,C++,Inheritance,Forward Declaration,因此,经过一些研究,我一直在努力为我的继承类提供单独的类头和源代码。以下示例是我的类的缩短版本。我所有的头文件都包含保护、默认构造函数和虚拟析构函数。它们还具有变量所需的getter和setter函数。我将主要展示变量和包含项 编译器错误位于代码下方的底部 主程序类: MainProgram.h #include "FileMgr.h" #include "InfoMgr.h" class FileMgr; class InfoMgr; class MainProgram { privat

因此,经过一些研究,我一直在努力为我的继承类提供单独的类头和源代码。以下示例是我的类的缩短版本。我所有的头文件都包含保护、默认构造函数和虚拟析构函数。它们还具有变量所需的getter和setter函数。我将主要展示变量和包含项

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

主程序类: MainProgram.h

#include "FileMgr.h"
#include "InfoMgr.h"

class FileMgr;
class InfoMgr;

class MainProgram
{
private:
    FileMgr* fileMgr;
    InfoMgr* infoMgr;
public:
             .
             .
             .
}; // !MainProgram
#include "MainProgram.h"
#include <string>

class MainProgram;

class MgrBase
{
protected:
    MainProgram* mainProgram;

    MgrBase() : mainProgram(nullptr) {}
    virtual ~MgrBase() {}

public:
    virtual bool Init() = 0;
}; // !MgrBase
#include "MgrBase.h"

class MainProgram;

class FileMgr : public MgrBase
{
public:
    FileMgr(MainProgram* mainProgram);
        .
        .
        .
};// !FileMgr
#include <string>
#include "MgrBase.h"

class MainProgram;

class InfoMgr : public MgrBase
{
public:
    InfoMgr(MainProgram* mainProgram);
    .
    .
    .
}; //!InfoMgr
MainProgram.cpp

#include "MainProgram.h"
#include <iostream>
#include <iostream>
#include <string>
#include "FileMgr.h"
#include "MainProgram.h"
#include <iostream>
#include "MainProgram.h"
#include "InfoMgr.h"
FileMgr.cpp

#include "MainProgram.h"
#include <iostream>
#include <iostream>
#include <string>
#include "FileMgr.h"
#include "MainProgram.h"
#include <iostream>
#include "MainProgram.h"
#include "InfoMgr.h"
如果我让InfoMgr.h看起来像

#include <string>

//Class Foward Declarations
class MainProgram;
class MgrBase;
如果我使InfoMgr.cpp不包含MgrBase,并使InfoMgr.h如下所示:

#include <string>
#include "MgrBase.h"

//Class Forward Declarations
class MainProgram;
class MgrBase;

标题中包含一个循环:

  • MainProgram.h
    包括
    FileMgr.h
  • FileMgr.h
    包括
    MgrBase.h
  • MgrBase.h
    包括
    MainProgram.h
您需要使用前向声明打破这个循环

头文件中的规则应该是:如果只需要声明指向类型
X
的引用或指针,则向前声明
X
,而不包括定义它的头文件。如果您正在声明(而不是定义)一个具有类型为
X
的参数或返回值的函数,则同样适用

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

就你而言:

  • 将两个
    #include
    语句从
    MainProgram.h
    移动到
    MainProgram.cpp
  • MgrBase.h
请创建一个,最好是在一些在线编译器上,这样我们就可以真正看到我们不想要“更多”的问题;我们想要一个最小的例子,正如帮助中心和维托里奥给你的链接后面所解释的。这是太多的代码;你还没有缩小问题的范围。解构问题是我们工作中的一项关键技能,所以我们让您学习它,您会很高兴的!你也没有说你从哪里得到这些错误,你的代码文件也不完整。好吧,构造一个,如果构造一个没有向你揭示问题是什么,那么我们可以继续。它不是一个。请点击链接并阅读页面。我不是故意装傻——你必须学会如何解构一个问题,我正试图帮助你学会写好问题,这样你就可以在将来得到更好的帮助(以及更少的反对票,这最终会导致一个问题禁令!)
 error: invalid use of incomplete type ‘class MgrBase’