克隆成矢量

C++ - Cloning into a vector

本文关键字:      更新时间:2023-10-16

因此,push_back仅将对象的副本添加到我的类std::vector<Action*>的向量中。我在对象上有一个clone方法,我正在推入一个向量:stack.push_back(pattern->actions[a]->clone());,其中克隆返回一个具有所有相同属性的新对象。这毫无意义吗?push_back已经做了我想要它做的事情吗?

push_back存储其参数的副本。但是实参是指针,而不是指针

因为你说Action是一个多态类型,我们不能做自然的事情,只是使用std::vector<Action>代替。

考虑您的需求,然后选择另一个解决方案。这是给你的:

  1. 使用非拥有的原始指针,如果你只是引用那个对象就不要克隆,它会活得足够长。
  2. 避免高级结构,并像您所展示的那样手动进行克隆。
  3. 考虑boost::variant。但是,在定义派生类时必须知道所有的派生类。
  4. 如果矢量拥有Action(参见std::make_unique),则使用std::unique_ptr
  5. 使用std::shared_ptr,如果它应该共享所有权(也参见std::make_shared)。
  6. 如果矢量不拥有Action,则使用std::weak_ptr
  7. 使用像这样的自制copy_ptr来自动克隆。

std::vector<Action*>存储指向Action的指针。

因此,push_back只向std::vector中添加对象的副本。

更准确地说,它添加了一个指向Action的指针的副本。在很大程度上,不,这个前提是错误的。

stack.push_back(pattern->actions[a]->clone());,其中clone返回一个具有所有相同属性的新对象。这毫无意义吗?

不,这不是没有意义的。但这与习语相反。您应该考虑使用std::vector<Action>创建一个复制构造函数(并注意三的规则!)。
相关文章:
  • 没有找到相关文章