问题描述
我想创建两个对象A
和B
,以便A.b()
返回对B
的引用(如果它仍然存在),否则返回null,反之亦然B.a()
。这个问题是否在以前某个地方的标准或广泛使用的实用程序库中解决了?
最近我遇到了两个单独的实例。我对C ++解决方案特别感兴趣,但了解Rust或其他非垃圾收集语言如何实现此目的可能会很有用。
我认为这可以通过引用计数来完成(使用A
存储B
和std::shared_ptr
并保留std::weak_ptr
个引用),我也可以想到一种方法避免这种情况(使用您喜欢的任何方法来管理A
和B
的生命周期,并存储纯引用和表示活动性的布尔值;当{{1}时在B
内更新布尔值}删除,反之亦然;在多线程上下文中,添加一个锁)。但是我的工作场所不鼓励使用A
,而后一种解决方案对我来说似乎有点复杂。我想知道有没有更简单的东西。
解决方法
此问题是否已通过标准解决?
是的。弱指针可用于实现此目的。
您已经注意到,析构函数也是如此。这一般不如弱指针适用。当您具有一对一关系时,它应该可以工作。
并存储普通引用和表示活跃度的布尔值
更简单的解决方案:使用指针。不需要布尔值,并且可以使对象可分配。
但是我的工作场所不鼓励使用std :: shared_ptr,而后一种解决方案对我来说似乎有点复杂。我想知道有没有更简单的东西。
您想与两个对象的生存期建立复杂的关系。我认为没有更简单的解决方案。您需要选择:
- 使用共享和弱指针来阻止这种沮丧。仔细记录为什么需要它的原因。
- 使用析构函数方法。我认为这并不复杂。
- 重新设计,使您不需要这种复杂的关系。