我想设计一个节点类,然后我可以将其用于各种类型的树,但是当我尝试考虑如何以不创建不必要的字段的方式进行时,我遇到了复杂的问题。例如,我有以下课程:
class Node {
protected:
Node *left;
Node *right;
}
Run Code Online (Sandbox Code Playgroud)
此类将具有处理获取和设置节点左右连接的方法。但是,我还将有下一堂课:
class BinaryNode : public Node {
protected:
BinaryNode *left_child;
BinaryNode *right_child;
BinaryNode *parent;
}
Run Code Online (Sandbox Code Playgroud)
除了新的父连接,左右子节点可以使用基类的左右连接来描述,但我不能使用它们,因为它们不是二进制节点。有没有合适的方法来重新调整它们的用途,使其按照我想要的方式行事?
我还想到这可能不值得付出努力,无论如何我应该创建新字段,这样我就不会被迫拖拽有时不直观的名称和可疑的铸造。我欢迎对这个想法发表意见。
使用建议的类层次结构,BinaryNode将有四个孩子。来自基础的左右通用节点,以及作为直接成员的左右二元节点。
除非您需要动态多态性,否则模板将是重用节点代码的合适方式。这是 Curiously Recurring Template Pattern 的典型用例:
template<class Child>
class Node {
protected:
Child *left;
Child *right;
};
class BinaryNode : protected Node<BinaryNode> {
protected:
BinaryNode *parent;
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
54 次 |
| 最近记录: |