我想设计一个节点类,然后可以用于各种类型的树,但当我试图考虑如何以不创建不必要的字段的方式来做时,我遇到了复杂的问题。例如,我有以下类。
class Node {
protected:
Node *left;
Node *right;
}
这个类会有一些方法来处理获取和设置节点的左右连接。但是,我还会有下一个类。
class BinaryNode : public Node {
protected:
BinaryNode *left_child;
BinaryNode *right_child;
BinaryNode *parent;
}
除了新的父节点连接之外 左右子节点可以用基类的左右连接来描述 但我不能使用它们 因为它们不是二进制节点 有没有合适的方法将它们重新使用,使其表现为我想要的样子?
我还想到,这样做可能不值得,无论如何我都应该创建新的字段,这样我就不会被迫拖着有时不直观的名字和可疑的铸造。我欢迎大家对这个思路发表意见。
用建议的类层次结构。BinaryNode
会有四个子节点。来自基础的左、右通用节点,左、右二进制节点作为直接成员。
除非你需要动态多态,否则模板将是重用节点代码的合适方式。这是一个典型的奇特循环模板模式的用例。
template<class Child>
class Node {
protected:
Child *left;
Child *right;
};
class BinaryNode : protected Node<BinaryNode> {
protected:
BinaryNode *parent;
};