【问题标题】:C++ - Cloning into a vectorC++ - 克隆到向量中
【发布时间】:2014-07-01 13:44:12
【问题描述】:

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

【问题讨论】:

  • 您的vector 实例是如何声明的? std::vector<foo>std::vector<foo *>,还是...?
  • @Brian,更新问题
  • 你的向量不包含对象,只是指针。所以它不能保存对象的副本。
  • 也许使用像copy_ptr我的google-fu这样的智能指针?
  • @Deduplicator 而不是 std::unique_ptrstd::shared_ptr 而不是自制实现

标签: c++ vector push clone


【解决方案1】:

push_back 存储其参数的 cpy。但参数是 pointer,而不是 pointee

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

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

  1. 使用非拥有的原始指针,如果您可以仅引用该对象,请不要克隆,它会存在足够长的时间。
  2. 避开高级构造并按照您的说明手动进行克隆。
  3. 考虑boost::variant。不过,您在定义它时必须知道所有派生类。
  4. 如果向量应拥有Action,请使用std::unique_ptr(另请参阅std::make_unique)。
  5. 如果应该共享所有权,请使用std::shared_ptr(另请参阅std::make_shared)。
  6. 如果向量不拥有且不应保持活动状态Action,则使用std::weak_ptr
  7. 使用自制软件 copy_ptr like this 进行自动克隆。

【讨论】:

    【解决方案2】:

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

    所以 push_back 只是将对象的副本添加到 std::vector 中。

    更准确的说法是它添加了指向Action 的指针的副本。大多数情况下,不,这个前提是错误的。

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

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

    【讨论】:

    • 除非Action 是多态类型并且clone() 返回指向其派生类型之一的指针。
    • @juanchopanza,是的,Action 有几个子类
    猜你喜欢
    • 2010-12-05
    • 2016-06-05
    • 2023-03-25
    • 2015-03-27
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    相关资源
    最近更新 更多