首页 > 解决方案 > 从继承中解决循环依赖

问题描述

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

我似乎对我的基类及其子类产生了循环依赖。

从程序入口开始,我需要根据用户输入初始化其中一个子类。我以为我可以包含基类的标头,其中包含子类的标头:

主文件

#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 {

如果不放置一个包含所有子类标头的中间“工厂”,则不确定如何解决此问题,每个子类标头都包含基类标头。

标签: c++c++11

解决方案


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

注意:class Base; // forward declaration不需要此行。


推荐阅读