【问题标题】:Passing a unique_ptr to a function which adds it to a vector将 unique_ptr 传递给将其添加到向量的函数
【发布时间】:2014-03-16 14:33:35
【问题描述】:

我有一个包含 unique_ptr 向量的类。该类还具有向向量添加元素的方法。

class PointerVector
{
  public:
    void addPointer(std::unique_ptr<int> p);

  private:
    std::vector<std::unique_ptr<int>> mPointers;
};

addPointer 方法定义:

void PointerVector::addPointer(std::unique_ptr<int> p)
{
  mPointers.emplace_back(std::move(p));
}

所以我使用std::move 来转移指针的所有权。

当我调用addPointer时,我也使用std::move

PointerVector pv;
std::unique_ptr<int> i(new i(1));
pv.addPointer(std::move(i));

这是正确的做事方式吗?一直打电话给std::move 感觉很麻烦。

编辑:我实际上想将一个 unique_ptr 向量保存到一个类中,但我想先尝试一个 int,以使事情变得更容易。

【问题讨论】:

  • 为什么要将unique_ptr的向量保存为int?为什么不std::vector&lt;int&gt; data; ??
  • 我实际上想将一个 unique_ptr 向量保存到一个类中,但我想先尝试一个 int ,以使事情变得更容易。
  • std::unique_ptr是接口的重要部分还是实现细节?
  • 这是一个实现细节。这就是为什么我不喜欢在 PointerVector 之外使用它。

标签: c++ c++11 vector unique-ptr


【解决方案1】:

几乎。当传递一个临时值时,您不需要使用std::move(),您的最后一个片段看起来会更好,如下所示(我不是在问您为什么需要存储指向 int 而不是 int 本身的智能指针)。

PointerVector pv;
pv.addPointer(std::unique_ptr<int>(new int(1)));

【讨论】:

  • 如果我想存储更复杂的类型怎么办?例如:创建一个Person 类的对象,设置人名,然后然后添加它?最好是这样吗? PointerVector pv; Person* p = new Person(); p-&gt;setName("John"); pv.addPointer(std::unique_ptr&lt;Person&gt;(p));
  • @RaptorDotCpp - 初始化时数据类型更复杂,不仅通过构造函数我确实会做std::unique_ptr&lt;Person&gt; p(new Person); ...; pv.addPointer(std::move(p));,细节很重要:-)
【解决方案2】:

由于您使用emplace_back 在向量末尾的正确位置直接构造一个新的unique_ptr&lt;int&gt; 元素,也许最简单的解决方案是让您的PointerVector 类封装整个unique_ptr 管理逻辑并只给它一个原始指针:

class PointerVector
{
  public:
    void addPointer(int* p);

  private:
    std::vector<std::unique_ptr<int>> mPointers;
};


void PointerVector::addPointer(int* p) {
     assert(nullptr != p);
     mPointers.emplace_back(p);
}

PointerVector pv;
pv.addPointer(new int(1));

【讨论】:

    猜你喜欢
    • 2016-03-18
    • 2012-03-30
    • 2018-03-12
    • 2015-08-07
    • 2014-11-09
    • 1970-01-01
    • 2012-11-27
    • 2015-09-03
    • 2013-01-16
    相关资源
    最近更新 更多