矢量的唯一副本<unique_ptr>
Unique copy of vector<unique_ptr>
我有一个 class 对象,其中包含一个 vector<unique_ptr>
。我想要这个对象的副本到 运行 非常量函数上。原件必须保持 const.
这样的 class 的复制构造函数会是什么样子?
class Foo{
public:
Foo(const Foo& other): ??? {}
std::vector<std::unique_ptr> ptrs;
};
您不能简单地复制一个 std::vector<std::unique_ptr>
,因为 std::unique_ptr
不可复制,所以它会删除矢量复制构造函数。
如果您不更改存储在矢量中的类型,那么您可以通过创建一个全新的矢量来创建一个 "copy",例如
std::vector<std::unique_ptr<some_type>> from; // this has the data to copy
std::vector<std::unique_ptr<some_type>> to;
to.reserve(from.size()) // preallocate the space we need so push_back doesn't have to
for (const auto& e : from)
to.push_back(std::make_unique<some_type>(*e));
现在 to
是 from
的单独副本,可以独立更改。
另外:如果你的类型是多态的,上面的方法将不起作用,因为你会有一个指向基class的指针。您需要做的是创建一个虚拟 clone
成员函数,并将 clone
return 和 std::unique_ptr
复制到实际派生对象的副本。这将使代码看起来像:
std::vector<std::unique_ptr<some_type>> from; // this has the data to copy
std::vector<std::unique_ptr<some_type>> to;
to.reserve(from.size()) // preallocate the space we need so push_back doesn't have to
for (const auto& e : from)
to.push_back(e->clone());
Nathan 上面的回答很好。此外,在多态情况下,我发现 this site 对定义 clone() 成员函数很有用。
我用过
std::unique_ptr<Base> Base::clone()
{
return std::make_unique<Derived>(*this);
}
这与 Nathan 后来的评论相似。
我有一个 class 对象,其中包含一个 vector<unique_ptr>
。我想要这个对象的副本到 运行 非常量函数上。原件必须保持 const.
这样的 class 的复制构造函数会是什么样子?
class Foo{
public:
Foo(const Foo& other): ??? {}
std::vector<std::unique_ptr> ptrs;
};
您不能简单地复制一个 std::vector<std::unique_ptr>
,因为 std::unique_ptr
不可复制,所以它会删除矢量复制构造函数。
如果您不更改存储在矢量中的类型,那么您可以通过创建一个全新的矢量来创建一个 "copy",例如
std::vector<std::unique_ptr<some_type>> from; // this has the data to copy
std::vector<std::unique_ptr<some_type>> to;
to.reserve(from.size()) // preallocate the space we need so push_back doesn't have to
for (const auto& e : from)
to.push_back(std::make_unique<some_type>(*e));
现在 to
是 from
的单独副本,可以独立更改。
另外:如果你的类型是多态的,上面的方法将不起作用,因为你会有一个指向基class的指针。您需要做的是创建一个虚拟 clone
成员函数,并将 clone
return 和 std::unique_ptr
复制到实际派生对象的副本。这将使代码看起来像:
std::vector<std::unique_ptr<some_type>> from; // this has the data to copy
std::vector<std::unique_ptr<some_type>> to;
to.reserve(from.size()) // preallocate the space we need so push_back doesn't have to
for (const auto& e : from)
to.push_back(e->clone());
Nathan 上面的回答很好。此外,在多态情况下,我发现 this site 对定义 clone() 成员函数很有用。
我用过
std::unique_ptr<Base> Base::clone()
{
return std::make_unique<Derived>(*this);
}
这与 Nathan 后来的评论相似。