正在从继承中解析循环依赖项

Resolving circular dependencies from inheritance

本文关键字:循环 依赖 继承      更新时间:2023-10-16

是否不可能包含基类头并通过它包含其所有子类?

我的基类及其子类似乎已经形成了循环依赖关系。

从程序条目中,我需要根据用户输入初始化其中一个子类。我想我可以包括基类的头,其中包括子类的头:

main.cpp

#include "baseclass.h"
int main()
{
...
}

基类.h

#include "sub1.h"
class Base
{
public:
int name;
};

sub1.h

#include "baseclass.h"
class Base; // forward declaration
class Sub : public Base
{
public:
int age;
};

所以依赖性是:

main -> baseclass -> sub1 -> baseclass -> sub1 -> etc...

如果我保持正向声明,g++ -std=c++11 -o prog *.cpp抛出:

error: invalid use of incomplete type 'class Base'

删除:

error: expected class-name before '{' token {

不知道如何在不放入中间"工厂"的情况下解决这个问题,该工厂包括所有子类标头,每个子类标头都包括基类标头。

baseclass.h中删除#include "sub1.h",并创建一个单独的头文件,其中包括您需要的所有派生类,并将此头文件包含在main.cpp中。

注:不需要class Base; // forward declaration这一行。

base.h中删除#include "sub1.h"(也是class Base正向声明(。不想使用sub的地方包括sub1.h,在本例中是主要的。如果你真的在构建一堆sub类型的子类,那么你很可能会实现一些东西来正确地创建它们。那东西可能是一家工厂。它看起来像这样:

// ClassFactory.h
#include "sub1.h"
#include "sub2.h"
...
#include "subN.h"
std::unique_ptr<Base> createClass(std::string name) {
if (name == "sub1")
return std::unique_ptr<Base>(new sub1());
if (name == "sub2")
return std::unique_ptr<Base>(new sub1());
...
return nullptr;
}

您的main将包含并使用以下文件:

#include "ClassFactory.h"
int main(int argc, char** argv)
{
...
std::unique_ptr<Base> myClass = createClass(argv[1])

重要提示:所有伪代码

然后,您将解决在运行时创建一组复杂的子类的问题,以及如何包含所有子类的难题。

如果您希望base.h包含sub1.h,则只有在定义class Base:之后才有可能

#ifndef BASE_H_
#define BASE_H_
class Base
{
public:
int name;
};
#include "sub1.h"
#endif

很明显,这消除了对Base的前向声明的需要;在包含的时候,它是完全定义的。