智能指针/编码模式的名称

Sig*_*erm 5 c++ boost design-patterns smart-pointers qt4

最近我经常遇到需要类似于这种数据结构的情况.

限制:C++ 03标准.


 +-----+--------------+               +----+
 |node0| NodeDataRef ->-------------->|data|
 +-----+--------------+               +----+
 +-----+--------------+                ^^ ^
 |node1| NodeDataRef ->----------------+| |
 +-----+--------------+                 | |
 +-----+--------------+                 | |
 |node2| NodeDataRef ->-----------------+ |
 +-----+--------------+                   |
                                          |
 +-----+--------------+                   |
 |root | RootDataRef ->-------------------+
 +-----+--------------+              
Run Code Online (Sandbox Code Playgroud)
  1. 有几Node类,其中每个Node拥有NodeDataRef"参考"(认为shared_ptr)以"同一个实例Data"(类,结构,不管是谁-动态分配).
  2. 还有一个" Root"或"主"节点/类,它将RootDataRef引用(这次,思考weak_ptr)保存到相同的" Data".
  3. 当所有Nodes都被销毁时,data也会被破坏并RootDataRef设置为0/ NULL.即NodeDataRef行为shared_ptr<Data>RootDataRef行为一样weak_ptr<Data>
  4. 但是,即使仍有活动的NodeDataRefs,根节点也可以强制销毁数据.在这种情况下NodeDataRef,指向数据的所有s都设置为NULL/ 0,RootDataRef并且也设置为0/ NULL.

weak_ptr<Data>可以强制销毁所有链接shared_ptr<Data>.

  1. 这种模式/智能指针类型是否有名称?
  2. 如何使用Boost或Qt 4 快速实现此功能?("快速"意味着无需编写类来维护引用列表)

And*_*owl 4

该模式/智能指针类型有名称吗?

据我所知,不,这不是具有常用名称的典型所有权模式。

如何使用 Boost 或 Qt 4 快速实现此功能?(“快速”意味着无需编写类来维护引用列表)

此用例没有预先打包的所有权策略,因为这会破坏共享所有权的意义。如果存在多个指向给定对象的共享指针,则根据定义,这些共享指针必须使该对象保持活动状态。如果给我一个共享指针,那就保证该对象将存在,直到我释放它。

如果您希望一个主对象能够命令销毁所指向的对象,无论其他对象是否持有指向它的共享指针,那么您将必须找出某种单独的机制来让它命令共享指针的所有持有者那个对象来释放它。

更新:

尽管存在“hacky”解决方案可以使这项工作“快速”完成,但我不建议您使用其中任何一个。这种模式非常不典型,您希望当有人(包括几个月后的您)阅读您的代码时它会很明显。

您的意图应该通过主对象和其他所有者之间的显式通信模式来明确,而不是隐藏在包装器、自定义删除器或其他任何位置中。