[英]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.