两个具有任意寿命且相互引用的对象?

问题描述

我想创建两个对象AB,以便A.b()返回对B的引用(如果它仍然存在),否则返回null,反之亦然B.a()。这个问题是否在以前某个地方的标准或广泛使用的实用程序库中解决了?

最近我遇到了两个单独的实例。我对C ++解决方案特别感兴趣,但了解Rust或其他非垃圾收集语言如何实现此目的可能会很有用。

我认为这可以通过引用计数来完成(使用A存储Bstd::shared_ptr并保留std::weak_ptr个引用),我也可以想到一种方法避免这种情况(使用您喜欢的任何方法来管理AB的生命周期,并存储纯引用和表示活动性的布尔值;当{{1}时在B内更新布尔值}删除,反之亦然;在多线程上下文中,添加一个锁)。但是我的工作场所不鼓励使用A,而后一种解决方案对我来说似乎有点复杂。我想知道有没有更简单的东西。

解决方法

此问题是否已通过标准解决?

是的。弱指针可用于实现此目的。

您已经注意到,析构函数也是如此。这一般不如弱指针适用。当您具有一对一关系时,它应该可以工作。

并存储普通引用和表示活跃度的布尔值

更简单的解决方案:使用指针。不需要布尔值,并且可以使对象可分配。

但是我的工作场所不鼓励使用std :: shared_ptr,而后一种解决方案对我来说似乎有点复杂。我想知道有没有更简单的东西。

您想与两个对象的生存期建立复杂的关系。我认为没有更简单的解决方案。您需要选择:

  • 使用共享和弱指针来阻止这种沮丧。仔细记录为什么需要它的原因。
  • 使用析构函数方法。我认为这并不复杂。
  • 重新设计,使您不需要这种复杂的关系。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...