复制指针向量而不切片

Copy a vector of pointers without slicing

本文关键字:切片 向量 指针 复制      更新时间:2023-10-16

>我需要复制多态对象的向量,在新向量中应该有指向相同多态类型的指针,只是不指向相同的数据,而是它们应该指向堆上的新数据。该数据需要设置为与原始矢量相同的数据。

std::vector < Component * > entity = baseEntity;

在这种情况下,新的矢量实体只是从baseEntity获取指针。这里不会发生切片,但是当我更改 baseEntity 中的指针时,它也会更改实体中的数据。如何根据我的情况正确复制它?

要实现这一点,您必须提供一种以多态方式克隆对象的方法,即提供可覆盖的克隆功能:

class Base
{
public:
    virtual std::unique_ptr<Base> clone() = 0;
};
class Foo : public Base
{
    int _class_stuff;
public:
    virtual std::unique_ptr<Base> clone()
    {
        return std::unique_ptr(new Foo(*this)); //Calls copy ctor
    }
};

现在,在复制向量时,遍历它调用每个元素的克隆方法:

std::vector<std::unique_ptr<Base>> clone_vector(const std::vector<std::unique_ptr<Base>>& vector)
{
    std::vector<std::unique_ptr<Base>> result;
    for(auto& element : vector)
        result.push_back(element->clone());
    return result;
}

下面是克隆的示例:

#include <memory>
#include <vector>
struct Component {
  virtual std::unique_ptr<Component> clone() const = 0;
};
struct AComponent : Component {
  virtual std::unique_ptr<Component> clone() const
  {
    return std::unique_ptr<Component>(new AComponent(*this));
  }
};
struct BComponent : Component {
  virtual std::unique_ptr<Component> clone() const
  {
    return std::unique_ptr<Component>(new BComponent(*this));
  }
};
int main(int,char**)
{
  std::vector<std::unique_ptr<Component>> old_entities;
  old_entities.push_back(std::unique_ptr<Component>(new AComponent));
  old_entities.push_back(std::unique_ptr<Component>(new BComponent));
  std::vector<std::unique_ptr<Component>> new_entities;
  new_entities.reserve(old_entities.size());
  for (auto &entity : old_entities) {
    new_entities.push_back(entity->clone());
  }
}