C ++ - 克隆到矢量中

时间:2014-07-01 13:44:13

标签: c++ vector push clone

所以push_back只会将对象的副本添加到我的班级std::vector<Action*>的矢量中。我在对象上有一个clone方法,我正在推入一个向量:stack.push_back(pattern->actions[a]->clone());其中clone返回一个具有所有相同属性的新对象。这没有意义吗? push_back做了我想做的事吗?

2 个答案:

答案 0 :(得分:1)

push_back存储了它的参数cpy。但是参数是指针,而不是指针

因为你说Action是一个多态类型,我们不能自然而然地只使用std::vector<Action>

考虑您的要求,然后选择其他解决方案。这里有一些给你:

  1. 使用非拥有原始指针,如果只是引用该对象就可以克隆,并且它会活得足够长。
  2. 避开高级构造,并在显示时手动进行克隆。
  3. 考虑boost::variant。但是,在定义它时,您必须知道所有派生类。
  4. 如果向量拥有std::unique_ptr,请使用Action(另请参阅std::make_unique)。
  5. 如果它应该共享所有权,请使用std::shared_ptr(另请参阅std::make_shared)。
  6. 如果向量不属于std::weak_ptr,则使用Action。{/ 1}}
  7. 使用自制啤酒copy_ptr like this进行自动克隆。

答案 1 :(得分:0)

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

  

因此push_back只会将对象的副本添加到std :: vector中。

更准确地说明它将指针的副本添加到Action。在大多数情况下,不,这个前提是错误的。

  

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

不,这不是没有意义的。但这与成语相反。您应该考虑使用std::vector<Action>创建一个复制构造函数(并注意Rule of Three!)。