强制父对象的生存期

Enforce lifetime of parent object

本文关键字:生存期 对象      更新时间:2023-10-16

考虑以下代码:

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

让孩子成为父母的一员将有助于确保这一点(特别是如果你不分发对孩子的引用并将其保存在其他地方(。原理很简单:子对象是在父对象内部构造的,在父对象被构造之前不会被破坏

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

按照其他顺序,迭代器(就像你孩子的迭代器一样(一旦容器的内容发生变化,就很容易失效,所以我会对它们保持警惕。

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