考虑以下代码:
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 不能比其 parent 长寿,但我希望尝试调用类似 Child childThing = getParent().getChild(5)
的方法是合理的。我怎样才能防止这种情况发生?是否有一种模式可以强制保留 Parent
的实例?如果可能的话,我不想复制 objects
,因为它的内容非常复杂。
最佳答案
将 child 作为 parent 的一员可以帮助您确保这一点(特别是如果您不分发对 child 的引用并将它们保存在其他地方)。原理很简单:子级在父级内部构造,只有在父级构造完成后才会被销毁。
至于复制对象,你总是可以分发引用或指针。那里没有相当大的复制惩罚。
在其他顺序中,一旦容器的内容发生变化,迭代器(如您的 child 所拥有的迭代器)很容易失效,因此我会对这些保持警惕。
编辑:发表评论后,您可以尝试使用 shared_ptr 来引用您的父对象。这些将使 parent 活着,而至少有一个 child 和他们在一起。 std::shared_ptr 是引用计数的,并且比常规的非托管指针具有较小的开销。例如,您可以将父对象的实例创建为 std::shared_ptr,然后将此指针复制到子对象上。一旦所有子项和父项本身超出范围,父项将被删除。
关于c++ - 强制执行父对象的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39469054/