在类Node
:
class Node {
public:
int data;
int numchild;
Node** nodelist;
Node(int data, int s);
};
我想指针(的阵列nodelist
)到其他节点,其具有从该节点的边缘。
是构建这样的阵列(并宣布它的上述的方式)一个正确的和最好的(最简单的或)可能的方式的以下方式吗? 如果不是,为什么和最新最好的方法是什么?
Node::Node(int d, int s) {
data = d;
numchild = s;
nodelist = new Node*[s];
}
一般来说,你不应该推倒重来。 原始阵列几乎总是错的路要走。 看一看从STL的各种容器,即std::vector
, std::list
。 我woud想在你的情况下std::vector
可能是最好的解决方案。
如果你想坚持的原始阵列,一个快速的警告: new Node*[s]
不初始化数组,这样的内容将是不确定的。 但是,如果你添加一组括号( new Node*[s]()
它会被初始化为零这是一件好事,因为它可以帮助你发现哪些条目已经被填补。
此外,当前的代码缺少析构函数delete[]
再次节点列表。 这正是为什么推荐使用标准集装箱的:他们有析构函数,将做的工作适合你。
好吧,如果你坚持,但答案既不是最好的,也不是最简单的,和正确性是非常多的负担了。
对于构造函数,使用基本初始化列表:
Node::Node(int d, size_t s)
: data(d), numchild(s), nodelist(new Node*[s])
{
}
我们还做numchild
一个无符号的类型,因为它代表了一个尺寸。
但现在你也必须照顾到解除分配上破坏内存。 一个简单的delete[]
不会做,因为你首先要遍历所有的孩子,递归解除分配他们的记忆。
总而言之,共享指针的载体将节省你的代码的约90%。