繁体   English   中英

从继承中解决循环依赖

[英]Resolving circular dependencies from inheritance

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

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

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

main.cpp中

#include "baseclass.h"

int main()
{
    ...
}

基类

#include "sub1.h"

class Base
{
    public:
        int name;
};

1小时

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

不知道如何解决这个问题,而无需放置一个中间“ factory”,该中间“ factory”包括所有子类头,每个子类头都包含基类头。

取出#include "sub1.h"baseclass.h ,并创建一个单独的头文件,它包含了所有你需要的派生类,以及包含这个头文件到main.cpp中。

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

base.h (也是class Base forward声明)中删除#include "sub1.h" 在本例中,您不想使用sub include 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的前向声明的需要; 在包含点它已被完全定义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM