复制指针向量而不切片
Copy a vector of pointers without slicing
>我需要复制多态对象的向量,在新向量中应该有指向相同多态类型的指针,只是不指向相同的数据,而是它们应该指向堆上的新数据。该数据需要设置为与原始矢量相同的数据。
例
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());
}
}
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- C 为向量的切片增加了常数
- 带有矢量切片的矢量指针,用于从预序和顺序向量生成树
- 我应该如何从特征 3 中的张量切片中获取向量
- 如何在c++中对向量进行切片并分配给它自己
- 复制指针向量而不切片
- 切片C数组创建c++向量,每3个元素只保留2个元素
- C++ 指针向量<base_class*>放置派生类但切片打印