【问题标题】:Enforce lifetime of parent object强制父对象的生命周期
【发布时间】:2016-09-13 11:36:33
【问题描述】:

考虑以下代码:

class Child {
   vector<Object>::iterator it;
}

class Parent {
   vector<Object> objects;

   Child getChild(int idx) {
       Child ret;
       ret.it = objects.begin() + idx;
       return ret;
   }
}

显然,孩子的寿命不能超过其父母,但我希望尝试调用类似 Child childThing = getParent().getChild(5) 的名称是合理的。我怎样才能防止这种情况?是否有强制保留Parent 实例的模式?如果可能的话,我不想复制objects,因为它的内容非常复杂。

【问题讨论】:

  • 你不想复制对象,但是你复制了 Child ret...
  • 这段代码的上下文是什么? Child::it 看起来像是悬空迭代器的承诺
  • @Jarod42 objectsParent 中的向量。复制Child 是可以的,我只是不想将向量复制到返回的孩子中:)
  • @wasthishelpful Parent 保证在创建后不会被更改。不过感谢您的意见,我会注意的!

标签: c++ object-lifetime


【解决方案1】:

让孩子成为父母的成员将帮助您确保这一点(特别是如果您不分发对孩子的引用并将其保存在其他地方)。原理很简单:child 是在 parent 内部构造的,直到 parent 存在才会被销毁。

至于复制对象,您总是可以分发引用或指针。那里没有可观的复制惩罚。

按照其他顺序,一旦容器的内容发生变化,迭代器(就像您的孩子所拥有的那样)很容易失效,所以我会提防这些。

编辑:在您发表评论后,您可以尝试使用 shared_ptr 来引用您的父对象。这些将让父母活着,而至少有一个孩子和他们在一起。 std::shared_ptr 是引用计数的,并且与常规的非托管指针相比具有较小的开销。例如,您可以将您的父级实例创建为 std::shared_ptr,然后将此指针复制到子级上。一旦所有子级和父级本身都超出范围,父级将被删除。

【讨论】:

  • Child 基本上是关于 Parent 的视图,我无法预测需要哪些视图,我也不希望它们保留在 Parent 中,因为它们可能不需要很长时间:/
  • 已编辑:也许你可以找到 std::shared_ptr 的使用。将父级的托管指针与您的子级绑定,让语言为您清理。
  • 嗯,这似乎是一个选项,但我也必须将父级创建为 shared_ptr。我会稍等一下,看看是否有其他建议,但如果没有任何建议,我会接受你的回答 :)
  • 没错...使用任何类型的指针都可能被视为令人讨厌的事情,但在这种情况下,它可能是(我猜是许多)强制设计约束的一种方式 :)。
  • 我继续执行您的建议(我很不耐烦^^)。由于父类是由工厂实例化的,因此对 shared_ptr 的更改没有太多副作用。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 2017-09-19
相关资源
最近更新 更多