为什么多个 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 文件中的规则应该是:如果你只需要声明 reference 或 pointer 类型 X
,前向声明 X
而不是包含定义它的 header。如果您声明(而不是定义)一个具有参数或 return 类型 X
值的函数,这同样适用。
如果您要访问 X
的成员或定义从 X
.[=27 派生的 class,则只需包括 X
的完整定义=]
你的情况:
- 将两个
#include
语句从 MainProgram.h
移动到 MainProgram.cpp
- 从
MgrBase.h
中删除 #include "MainProgram.h"
因此,经过一些研究,我一直在努力为我的继承 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 文件中的规则应该是:如果你只需要声明 reference 或 pointer 类型 X
,前向声明 X
而不是包含定义它的 header。如果您声明(而不是定义)一个具有参数或 return 类型 X
值的函数,这同样适用。
如果您要访问 X
的成员或定义从 X
.[=27 派生的 class,则只需包括 X
的完整定义=]
你的情况:
- 将两个
#include
语句从MainProgram.h
移动到MainProgram.cpp
- 从
MgrBase.h
中删除
#include "MainProgram.h"