如何将Derived对象添加到unique_ptr的向量中

时间:2014-07-17 04:21:10

标签: c++ pointers vector unique-ptr

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

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);

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

3 个答案:

答案 0 :(得分:6)

只要指向第二种类型的指针可以隐式转换为指向第一种类型的指针,{p> unique_ptr<T>就会有一个构造函数从unique_ptr<U>移出另一种类型U。 {1}}不是数组类型。所以只需使用U即可。请参阅demo

要接受从vec.push_back(make_unique<Item>(thing));派生的所有内容,请使用模板:

Base

如果template <typename D> void AddItem(const D& thing) { vec.push_back(make_unique<D>(thing)); } 不是来自D,则会在Base处收到编译错误。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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

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

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

这会创建一个新的Item,然后从中构建unique_ptr<Base>

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

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