执行 parent object 的生命周期

Enforce lifetime of parent object

考虑以下代码:

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是在parent里面构建的,直到parent才被销毁。

至于复制objects,你可以随时分发参考或指针。那里没有相当大的复制惩罚。

在其他顺序中,迭代器(如您的 child 拥有的迭代器)一旦其容器的内容发生变化就很容易失效,因此我会对它们保持警惕。

编辑:在您发表评论后,您可以尝试使用 shared_ptr 来引用您的 parent objects。这些将使 parent 保持活动状态,同时至少有一个 child。 std::shared_ptr 是 reference-counted 并且比常规的非托管指针有小的开销。例如,您可以将 parent 的实例创建为 std::shared_ptr,然后将此指针复制到 children 上。一旦所有 children 和 parent 本身超出范围,parent 将被删除。