如何将不同的派生对象添加到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);跟进,没有你不能,任何关于使用哪种智能指针的建议
发布于 2014-07-17 12:33:03
unique_ptr<T>有一个构造函数,只要指向第二个类型的指针可以隐式转换为指向第一个类型的指针,并且U不是数组类型,该构造函数就可以从不同类型的U移动。所以只需使用vec.push_back(make_unique<Item>(thing));即可。参见demo。
要接受从Base派生的所有内容,请使用模板:
template <typename D>
void AddItem(const D& thing) {
vec.push_back(make_unique<D>(thing));
}如果D不是从Base派生的,则在push_back处会出现编译错误。
发布于 2014-07-17 12:42:07
您希望使AddItem()方法成为模板方法,这样就不必为每个派生类编写不同的函数。修改现有实现:
template <typename DERIVED>
void
AddItem (const DERIVED &thing)
{
vec.push_back(make_unique<DERIVED>(thing));
}发布于 2014-07-17 12:31:30
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));https://stackoverflow.com/questions/24794835
复制相似问题