有 shared_ptr
的 vector
到基类。
struct Base
{
virtual ~Base() = 0 {}
};
struct Derived1 : Base
{
};
struct Derived2 : Base
{
};
std::vector<std::shared_ptr<Base>> v;
v.push_back(std::make_shared<Base>(Derived1()));
v.push_back(std::make_shared<Base>(Derived2()));
如何复制vector
?
拷贝的指针必须指向新对象。
您应该向Base
添加一个纯virtual
成员函数,例如clone
。在派生的 class
es 中实现它,然后执行如下操作:
std::vector<std::shared_ptr<Base>> copy(std::shared_ptr<Base> const &input) {
std::vector<std::shared_ptr<Base>> ret;
ret.reserve(input.size());
for(auto const &p: input) {
ret.push_back(p->clone());
}
return ret;
}
话虽这么说,但这是个坏主意。您正在破坏语义,例如直接分配 vector
和复制构造函数,因为它们不会执行用户期望的操作(假设您实际上需要为每个对象创建一个新实例)。