从继承中解决循环依赖

时间:2018-08-01 07:46:58

标签: c++ c++11

是否不可能包含基类标头,并使其包含所有的子类?

我的基类及其子类似乎已经有了循环依赖。

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

main.cpp

#include "baseclass.h"

int main()
{
    ...
}

baseclass.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 {

不确定是否要解决这个问题,而无需放置一个中间“工厂”,该工厂包括所有子类头,每个子类头都包含基类头。

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

#include "sub1.h"(也是base.h转发声明)中删除class Base。如果您不想使用sub,请在其中包含sub1.h,主要是在这种情况下。如果您实际上是在构建一堆sub类型的子类,那么很可能您将实现某种方法以正确地创建它们。那可能是factory。看起来像这样:

// 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])

大注释: 所有伪代码

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

答案 2 :(得分:0)

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

#ifndef BASE_H_
#define BASE_H_

class Base
{
    public:
        int name;
};

#include "sub1.h"
#endif

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