【问题标题】:How to create array of pointers in C++如何在 C++ 中创建指针数组
【发布时间】:2011-09-23 19:00:07
【问题描述】:

在课堂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<Node*>
  • 我的意思是创建后它不会增长..从例子中看不出来
  • @yi_H:如果你仔细看,数组大小是通过参数传递给构造函数的。
  • @yi_H - 是的,在这个意义上它是固定大小的!
  • 当然,我必须仔细观察才能看到.. :/

标签: c++ arrays class pointers constructor


【解决方案1】:

一般来说,您不应该重新发明轮子。原始数组几乎总是错误的方法。查看 STL 中的各种容器,即std::vectorstd::list。我想在你的情况下std::vector 可能是最好的解决方案。

如果你想坚持使用原始数组,快速警告:new Node*[s] 不会初始化数组,因此内容将是未定义的。但是,如果您添加一组括号 (new Node*[s]()),它将被初始化为零,这是一件好事,因为它可以帮助您发现哪些条目已被填写。

此外,您当前的代码再次缺少指向 delete[] 节点列表的析构函数。这正是推荐使用标准容器的原因:它们有析构函数可以为你完成工作。

【讨论】:

  • 感谢矢量建议,但我想只使用原始数组。
  • 加上括号会初始化指针,对吧?它不会构造新的 Node 对象并将它们初始化为零?
  • 它只是将数组归零。它不会构造单个 Node 对象,你需要自己做。如果你想在这个时候构造它们,对它们都使用相同的构造函数参数,你应该将 nodelist 设为 Node* 并执行 new Node[s];
  • @Nitin,出于兴趣,您为什么不想使用现有容器之一? boost::ptr_vectorboost::ptr_array 很适合这里。它还可以处理诸如确保在复制构造函数和operator= 中获得预期行为。
  • @Nitin:不要认为这是不尊重,但我(或我们?)仍然认为你不应该使用原始数组。愿意解释您选择它而不是向量/列表/等的理由吗?或者至少告诉我们您的要求?
【解决方案2】:

好吧,如果你坚持,但答案既不是最好的也不是最简单的,而且正确性现在是你的负担。

对于构造函数,使用基本初始化列表:

Node::Node(int d, size_t s)
: data(d), numchild(s), nodelist(new Node*[s])
{
}

我们还将numchild 设为无符号类型,因为它代表一个大小。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多