gpt4 book ai didi

c++ - 如何使用 weak_ptr 构造一个包含对父对象的引用的对象?

转载 作者:行者123 更新时间:2023-11-27 23:26:20 26 4
gpt4 key购买 nike

假设我有一个包含子对象的 shared_ptr 的对象。

我希望子对象有一个指向父对象的 weak_ptr,子对象的构造函数应该是什么样子,我应该如何从父对象构造一个子对象?

提前致谢

最佳答案

由于您拥有子对象的唯一所有权,因此可以保证子对象的生命周期不会超过其父对象。你可以有一个像这样的模型。

struct Parent;

struct Child {
Child( Parent& p ) : p_(&p) {}
Parent* p_;
};

#include <memory>

struct Parent {
std::unique_ptr<Child> c_;
void AddChild() {
c_.reset(new Child(*this));
}
};

当然,子级在析构函数中对父级所做的任何事情都应该小心,它可能会因为其父级超出范围而被销毁。这是关于一个 child 对它的 parent 有一个 weak_ptr 的唯一优势(它仍然不能从它的析构函数中对 parent 做任何事情,但至少它可以安全地告诉它)但是这个依赖于它的父级由 shared_ptr 拥有,这对子级来说是一个更加不灵活的设计。

这将是 weak_ptr 解决方案:

// NOT RECOMMENDED
#include <memory>

struct Parent;

struct Child {
Child( const std::shared_ptr<Parent>& p ) : p_(p) {}
std::weak_ptr<Parent> p_;
};

struct Parent : std::enable_shared_from_this<Parent> {
std::unique_ptr<Child> c_;
void AddChild() {
// Warning, undefined behaviour if this Parent
// isn't owner by shared_ptr
c_.reset(new Child(shared_from_this()));
}
};

关于c++ - 如何使用 weak_ptr 构造一个包含对父对象的引用的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9240601/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com