正在从继承中解析循环依赖项
Resolving circular dependencies from inheritance
是否不可能包含基类头并通过它包含其所有子类?
我的基类及其子类似乎已经形成了循环依赖关系。
从程序条目中,我需要根据用户输入初始化其中一个子类。我想我可以包括基类的头,其中包括子类的头:
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
的前向声明的需要;在包含的时候,它是完全定义的。
- C++GTKMM gui循环依赖关系
- 如何在头文件中声明类模板(由于循环依赖关系)
- 如何在具有循环依赖的类中dynamic_cast?
- C++模板方法中的循环依赖关系
- 修复循环依赖项 c++17 标头
- 涉及全局对象的循环依赖C++
- 循环依赖,在继承类的情况下使用覆盖方法
- Wt::D bo 中的循环依赖关系
- 在包含窗口标头时难以解决循环依赖关系问题
- 解决循环依赖关系 c++ 的想法
- C++循环依赖关系,未声明的标识符
- C++ 中的循环依赖关系问题
- 错误 C2512 视觉C++(并且不是循环依赖项)
- CMake 外部和内部静态库的循环依赖关系
- 正在从继承中解析循环依赖项
- "std::shared_ptr"循环依赖关系是如何导致问题的
- 纯引用而不是weak_ptr来打破循环依赖关系
- "invalid use of incomplete type" .解决循环依赖关系
- 如何避免模板方法的循环依赖
- 循环依赖结构,使用前向声明时结构的错误重定义