【问题标题】:How do you add Derived objects to a vector of unique_ptr如何将派生对象添加到 unique_ptr 的向量
【发布时间】:2014-09-07 19:27:46
【问题描述】:

如何将不同的派生对象添加到 unique_ptr 的向量中。 使用指针向量,我将创建项目,然后创建指向对象的基指针并传递要添加的指针,但 make_unique 不接受指针,我不想为每种类型的派生对象创建重载函数。

class Base{...};

class Item:public Base{...};

Add_Item(Base* thing)
{   
    vec.push_back(thing);
}

//Problem with this is i have multiple derived objs and would rather have 1 Add_Item instead of multiple Add_Item functions.(if possible)
Add_Item(Item thing)
{   //this runs,but i lose anything that was in Item class
    vec.push_back(make_unique<Base>(thing));
}

/----------------------------------

跟进问题,你能不能在另一个向量中有一个 unique_ptr 的向量。 我已经尝试过了(你们向我展示了两种方式,使用模板 Add_Item 函数和项目 Add_Item 函数)。但都产生了错误。

class Item: public Item
{  vector<unique_ptr<Base>>inv }

Item bag;
Item n_bag;
bag.Add_Item<I>(n_bag);

跟进跟进,不,你不能,任何关于使用什么样的智能指针的建议

【问题讨论】:

  • 谢谢大家的帮助,我有一个后续问题,是否可以在 unique_ptr 的另一个向量中包含一个 unique_ptr 的向量?
  • 对此问题和答案的重要说明。 将基类析构函数设为虚拟很重要。 如果您忘记了,正常编译不会警告您。但这会导致内存泄漏。

标签: c++ pointers vector unique-ptr


【解决方案1】:

unique_ptr&lt;T&gt; 有一个构造函数,它从不同类型的 unique_ptr&lt;U&gt; 移动到 U类型。所以只需使用vec.push_back(make_unique&lt;Item&gt;(thing));。见demo

要接受源自Base 的所有内容,请使用模板:

template <typename D>
void AddItem(const D& thing) {
    vec.push_back(make_unique<D>(thing));
}

如果D 不是从Base 派生的,则会在push_back 处收到编译错误。

【讨论】:

  • +1 但当然需要std::make_unique,这不是 C++11 的一部分。
  • @Cheersandhth.-Alf 好吧,OP 在他们的代码中使用了它,所以我很高兴假设它是可用的。
  • @TC 答案会更好(正如顾问所说),如果包含澄清评论,即明确说明的假设。
【解决方案2】:

您想让AddItem() 方法成为模板方法,这样您就不必为每个派生类编写不同的函数。修改现有实现:

template <typename DERIVED>
void
AddItem (const DERIVED &thing)
{
    vec.push_back(make_unique<DERIVED>(thing));
}

【讨论】:

    【解决方案3】:

    std::make_unique() 辅助函数创建一个给定类型的新对象。在您的情况下,这是一个 Base 对象,这不是您想要的。

    相反,您可以手动构造所需的std::unique_ptr

    vec.push_back(std::unique_ptr<Base>(new Item(thing)));
    

    这会创建一个新的Item,然后从中构造一个unique_ptr&lt;Base&gt;

    或者,您也可以简单地创建一个unique_ptr&lt;Item&gt;,并在将其添加到向量时让隐式转换将其转换为基指针:

    vec.push_back(std::make_unique<Item>(thing));
    

    【讨论】:

      猜你喜欢
      • 2017-03-23
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 2014-04-24
      • 1970-01-01
      • 2020-09-30
      相关资源
      最近更新 更多