【发布时间】:2016-08-18 19:42:40
【问题描述】:
我的程序有一个抽象类 BaseNode,它有 2 个派生类 ChoiceNode 和 OpponentNode。我想在 BaseNode 中编写一个名为“returnOpposite”的纯虚函数,如果从 ChoiceNode 调用它应该返回一个 OpponentNode,如果从 OpponentNode 调用它应该返回一个 ChoiceNode。
在 BaseNode.h 中
class BaseNode {
protected:
virtual BaseNode& returnOpposite() = 0;
}
在 ChoiceNode.h 中
#include "BaseNode.h"
class ChoiceNode: public BaseNode {
OpponentNode& returnOpposite();
}
在 OpponentNode.h 中
#include "BaseNode.h"
class OpponentNode: public BaseNode {
ChoiceNode& returnOpposite();
}
我的问题是 Opponent/ChoiceNode 需要了解相反的类,这通常可以通过使用前向声明来解决,但是为了让编译器识别相反的类与 BaseNode 是协变的,它需要有关该类的上下文信息。
据我了解,此信息是通过包含适当的头文件来提供的。但是,这样做会导致某种循环依赖。 ChoiceNode 需要包含 OpponentNode,而 OpponentNode 本身也需要包含 ChoiceNode,但是有了标头保护,OpponentNode 似乎不会知道 ChoiceNode 类声明。
如何解决这个明显的 catch-22?有没有办法在不涉及循环依赖的情况下提供有关类的上下文信息?
【问题讨论】:
标签: c++ inheritance polymorphism circular-dependency