在一个/多对多 C++ 类关联中处理循环对象拥有引用的最佳方法是什么?

问题描述 投票:0回答:1

美好的一天。我面临着一项编程设计任务,由于缺乏经验,我正在努力选择最佳的实施方法。我很高兴听到哪些实践、范式或模式适用于这种情况。

问题设置

您需要在 C++98 标准中编写一个可以拥有抽象

Worker
Tool
类。
Tool
可以独立存在,因此可以由工人装备和拆卸;工具不能有多个工人所有者。

然而,让这个问题变得更加棘手的是这些对象的生命周期需要进行相应的管理:

  • 如果
    Tool
    被破坏,则需要取消装备,因为持有指向已破坏工具的指针可能会导致未定义的行为。
  • 同样,如果
    Worker
    被销毁,则
    Tool
    应该被否认。
  • 如果
    Tool
    已分配给
    Worker
    ,则将其分配给另一个
    Worker
    确实会从原始工作人员中删除
    Tool

最重要的是,假设有一个名为

Workshop
的类。车间必须只接受拥有某种预定类型的可用工具的工人(我决定将
Workshop
制作为
Tool
子类型的模板)。

如果车间注册了一名工人,则正确类型的随机可用工具将与其关联,并且对其他注册者不可用。再说一遍,

  • 如果
    Worker
    被摧毁,他们就会离开车间。
  • 如果
    Tool
    Worker
    中使用的
    Workshop
    被销毁或分配给其他工人,则
    Worker
    离开工坊。

问题

建立这种关系的最佳方法是什么?

目前,为了实现销毁时放弃工具,我将

Tool
指针存储在工人内部,并将
Worker
指针存储在
Tool
内部。
~Tool()
调用
Worker
方法来取消装备它。但是,由于我希望能够破坏两个类的关系,例如,有一个
Tool::unset_owner()
Worker::unequip(Tool*)
,所以它们都不断互相调用,有时会导致无限循环。

为了添加

Workshop
支持,我决定创建一个
WorkshopBase
来隐藏其
ToolType
模板,并在
std::map<Tool*, WorkshopBase*>
中持有
Worker
来注册工具和研讨会。但是,它进一步导致调用试图相互删除/插入指针的双面方法链。

但是,我觉得我错过了一些重要的东西,并且违反了这种一对多+多对多关系的一些最佳实践。所以我的问题是:

  • 这种情况下如何尽可能避免耦合?
  • 我见过很多帖子声称这是一种不好的做法。我想知道是否有一种设计模式可以解决这个问题?您认为带有管理类的事件系统会更合适吗?
  • 总而言之,如何优雅地达到我想要的结果?

提醒:我正在寻找 C++98 解决方案。但是,我更希望获得具有更新标准的解决方案的答案,以及

*_ptr<>
类的使用,也许作为脚注。

c++ oop design-patterns aggregation circular-reference
1个回答
0
投票

对象池模式是一种软件创建设计模式,它使用一组随时可用的初始化对象(“池”),而不是按需分配和销毁它们。

© www.soinside.com 2019 - 2024. All rights reserved.