我需要复制多态对象的向量,在新向量中应该有指向相同多态类型的指针,只是不指向相同的数据,而是它们应该指向堆上的新数据。该数据需要设置为与原始向量相同的数据。
例子
std::vector < Component * > entity = baseEntity;
在这种情况下,新的向量实体只是从 baseEntity 获取指针。这里不会发生切片,但是当我更改 baseEntity 中的指针时,它也会更改实体中的数据。如何根据我的情况正确复制它?
我需要复制多态对象的向量,在新向量中应该有指向相同多态类型的指针,只是不指向相同的数据,而是它们应该指向堆上的新数据。该数据需要设置为与原始向量相同的数据。
例子
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
}
};
现在在复制向量时,调用每个元素的 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;
}
下面是一个克隆的例子:
#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());
}
}