请考虑以下代码:
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
,因为它的内容非常复杂。
答案 0 :(得分:1)
让孩子成为父母的一员可以帮助您确保(特别是如果您不向周围的孩子分发参考资料并将其保存在其他地方)。原则很简单:孩子是在父母内部构建的,并且在父母成员之前不会被摧毁。
对于复制对象,您始终可以分发引用或指针。那里没有相当大的复制惩罚。
按照其他顺序,迭代器(就像你的孩子那样)一旦容器内容发生变化就很容易失效,所以我要小心那些。
编辑:发表评论后,您可以尝试使用shared_ptr来引用您的父对象。这些将使父母保持活力,而至少有一个孩子与他们在一起。 std :: shared_ptr是引用计数的,并且在常规非托管指针上的开销很小。例如,您可以将父项的实例创建为std :: shared_ptr,然后在子项上复制此指针。一旦所有孩子和父母都超出了范围,父母将被删除。