Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C++;_C++_Arrays_Class_Pointers_Constructor - Fatal编程技术网

C++ 如何在C++;

C++ 如何在C++;,c++,arrays,class,pointers,constructor,C++,Arrays,Class,Pointers,Constructor,在类节点中: class Node { public: int data; int numchild; Node** nodelist; Node(int data, int s); }; 我想要一个指向其他节点的指针数组(nodelist),这些节点与此节点有边 下面构造这样一个数组的方法(以及上面声明它的方法)是正确的、最好的(或最简单的)方法吗?如果没有,为什么?最好的方法是什么 Node::Node(int d, int s) { data

在类
节点中

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
。我猜在你的例子中,std::vector可能是最好的解决方案

如果要继续使用原始数组,则会出现一个快速警告:
new Node*[s]
不会初始化数组,因此内容将未定义。但是,如果添加一组括号(
新节点*[s]()
),它将被初始化为零,这是一件好事,因为它可以帮助您发现哪些条目已经填充


另外,您当前的代码缺少一个析构函数来再次删除节点列表。这正是为什么建议使用标准容器:它们有析构函数,可以为您完成工作

好吧,如果你坚持的话,但答案既不是最好的,也不是最容易的,正确性是你现在的主要负担

对于构造函数,请使用基本初始值设定项列表:

Node::Node(int d, size_t s)
: data(d), numchild(s), nodelist(new Node*[s])
{
}
我们还将
numchild
设为无符号类型,因为它表示大小

但是现在,您还必须注意在销毁时释放内存。一个简单的
delete[]
是不行的,因为您首先必须遍历所有子对象并递归地释放它们的内存


总之,一个共享指针向量将为您节省大约90%的代码。

只需使用适当的STL容器,如
std::vector
。我的意思是,它在创建后不会增长。。从表面上看不明显example@yi_H:如果仔细观察,数组大小通过参数传递给构造函数。@yi_H-是的,在这个意义上它是固定大小的!当然,我必须仔细看看/Thanx表示向量的建议,但我只想使用原始数组。加括号将初始化指针,对吗?它不会构造新的节点对象并将它们初始化为零?它只是将数组归零。它不会构造单节点对象,您需要自己完成。如果您想在此时构造这些节点,并且所有节点都使用相同的构造函数参数,那么应该将nodelist设置为一个
节点*
,并执行
新建节点
@Nitin,出于兴趣,为什么不使用现有的容器?或者很适合这里。它还可以处理诸如确保在复制构造函数中获得预期行为和
操作符=
@Nitin:不要认为这是不尊重,但我(或我们?)仍然认为不应该使用原始数组。想解释一下你选择它而不是向量/列表/等等的原因吗?或者至少告诉我们你的要求?