复制指针向量而不切片

时间:2013-09-23 22:01:03

标签: c++ pointers vector copy object-slicing

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

实施例

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

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

以下是克隆的一个例子:

#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());
  }
}