如何使用weak_ptr构造一个对象,该对象保存对父项的引用
How do I construct an object that holds a reference to a parent using a weak_ptr?
>假设我有一个对象,其中包含对子对象的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));
}
};
当然,子级应该小心它在析构函数中对父级所做的任何事情,它可能会被销毁,因为它的父级超出了范围。这是关于子项对其父级weak_ptr
的唯一优势(它仍然无法从其析构函数对父级执行任何操作,但至少它可以安全地判断这一点(,但这依赖于其父级由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++ 对象的 std::vector 保存到磁盘?
- C++17 如何保存泛型可调用对象以供以后使用
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 将对象信息保存到二进制文件中
- C++两次从文件保存对象读取多重继承
- 有没有办法自动初始化 std::shared_ptr 来保存有效对象?
- 如何调用返回双精度或字符串并将其保存在地图上但作为对象的类的方法
- 将抽象值对象保存在包装器中和继承的用法中
- 如何保存模板的对象阵列进行文件
- 我的共享内存对象保存在哪里
- 保存对象的攻击函数并稍后称呼它是明确定义的行为
- 如何创建一个动态数组,该数组可以保存从C++中派生的同一基类的所有不同对象
- 即使在 C++ 中的 fstream.clear() 之后,对象也没有被保存
- 分类一个向量,该向量由该类中的成员字符串保存对象
- C 保存对象分配和删除
- 保存对象并以任何特定顺序加载它们
- 访问 C 中保存C++对象的 void 指针的内容
- 如何在单个数组中保存对象的动态数组
- 如何保存对象(在这种情况下,球员)在一个列表中的c++
- 如何保存对象的集合并在c++向量中使用它们