1

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

例子

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

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

4

2 回答 2

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

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

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;
}
于 2013-09-23T22:16:32.220 回答
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());
  }
}
于 2013-09-23T22:15:06.863 回答