gpt4 book ai didi

c++ - OOP:设计一棵树,在 Node 类和 Tree 类之间划分功能

转载 作者:太空宇宙 更新时间:2023-11-04 13:52:20 25 4
gpt4 key购买 nike

我需要实现一个自定义树类(使用 C++)。在我的工作中,我见过许多树的实现。一些实现了一个暴露给用户的“ super 节点”类。其中(根节点)充当树的实例。一些暴露了一个树类,它利用一个节点类来构造一棵树。一些将节点类用作纯数据结构,将树构造等功能留给树类。其他人将构造 - 如 node.Split(),放入节点类中。

假设您需要设计一个二叉树(如 KD 树)。从 OOP 的角度来看,什么是“最佳”方法。节点类是否仅包含数据或将自身拆分为子节点的逻辑?一个节点类一般应该包含多少逻辑?

在此先感谢您的建设性意见!

最佳答案

这是您应该始终遵循的一条 OOP 规则,

Every class represents an entity. Classes have properties and methods i.e. the attributes of the entities and it's behaviour

所以你需要按照你对场景的理解。

这是我看待节点的方式。它有一些数据,一个右节点引用和一个左节点引用。我不认为节点除了为您提供数据之外应该能够做任何事情,所以我会写一个像这样的节点类:

class Node
{
public:
int Data; // yeah, you would obviously use templates, so it's not restricted to a particular type

Node* Left;
Node* Right;

// also you can write constructors and maybe some sort of cast operator overload to be able to make the

// we could also make it return the subtree itself
getRightSubTree(){ return Tree(*Right); }
getLeftSubTree(){ return Tree(*Left); }
};

那么一棵树应该是这样的。

class Tree
{
private:
Node root;
public:
Tree(Node t):root(t){} // every tree should have a root. Cannot be null.

// since the root node will be able to handle the tree structure, now we'll need the necessary methods
void addNode(Node n){
// code here
}
....


getSubTree(int data){
// check if node with that data exists and all
...
Node n = getNode(data);
return Tree(n);
}
};

好的,我想你现在已经有了主意。这完全取决于您如何看待系统。

关于c++ - OOP:设计一棵树,在 Node 类和 Tree 类之间划分功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22994450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com