【问题标题】:C++11 unique_ptr array and constructor parametersC++11 unique_ptr 数组和构造函数参数
【发布时间】:2015-06-17 17:17:39
【问题描述】:

我有一个名为 Widget 的 C++ 类,我可以使用 C++11 智能指针数组工具来创建它们的动态数组,如下所示:

std::unique_ptr<Widget[]> widget(new Widget[number_of_widgets]);

现在,我更改了对象,使构造函数现在接受两个整数参数。是否仍然可以使用智能指针数组并调用参数化构造函数?

【问题讨论】:

    标签: c++11 stl smart-pointers


    【解决方案1】:

    您可以,但前提是您知道编译时要构建的元素的确切数量:

    const std::size_t number_of_widgets = 2;
    std::unique_ptr<Widget[]> widget(new Widget[number_of_widgets]{Widget(1, 2), Widget(3, 4)});
    

    Live demo

    否则你不能。

    但是,通常对数组使用智能指针并不是一个好的设计,尤其是对于unique_ptr,其中一个简单的vector(或array,或string)最终会完成同样的工作。

    引用 Scott Meyers:

    对于数组,std::unique_ptr 的存在应该只是您的智力兴趣,因为 std::arraystd::vectorstd::string 实际上总是比原始数组更好的数据结构选择。

    【讨论】:

    • 谢谢你。我想我可以将 std::array 与类似的初始化列表想法一起使用。
    • Scott Meyers 的好名言。但是有时我喜欢使用带有智能指针的原始数组(我不知道为什么!)。
    • 我不同意 Scott Meyers,有时您需要直接控制数组的生命周期。当您需要从某个库(可以用 C 编写)发送或接收数组时,就会发生这种情况。除此之外,更喜欢std::vector
    • @Yankes,具有唯一的 ptr,一次只能由一个人拥有该阵列,但使用 vector 也是如此。在这两种情况下,您都可以移动它。在这两种情况下,除了正常的对象生命周期之外,您还可以决定“杀死”它(resetclear)。我是否错过了 unique_ptr 拥有但 vector 没有的东西?
    【解决方案2】:

    其实这个问题与智能指针无关,它相当于
    “如何使用带参数的构造函数初始化new Widget[number_of_widgets]

    答案是:你不能。

    【讨论】:

      猜你喜欢
      • 2013-12-24
      • 2021-08-28
      • 2017-02-19
      • 2016-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-24
      • 1970-01-01
      相关资源
      最近更新 更多