强制父对象的生命周期

时间:2016-09-13 11:36:33

标签: c++ object-lifetime

请考虑以下代码:

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,因为它的内容非常复杂。

1 个答案:

答案 0 :(得分:1)

让孩子成为父母的一员可以帮助您确保(特别是如果您不向周围的孩子分发参考资料并将其保存在其他地方)。原则很简单:孩子是在父母内部构建的,并且在父母成员之前不会被摧毁。

对于复制对象,您始终可以分发引用或指针。那里没有相当大的复制惩罚。

按照其他顺序,迭代器(就像你的孩子那样)一旦容器内容发生变化就很容易失效,所以我要小心那些。

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