执行 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 将被删除。
考虑以下代码:
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 将被删除。