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