美好的一天。我面临着一项编程设计任务,由于缺乏经验,我正在努力选择最佳的实施方法。我很高兴听到哪些实践、范式或模式适用于这种情况。
您需要在 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<>
类的使用,也许作为脚注。
对象池模式是一种软件创建设计模式,它使用一组随时可用的初始化对象(“池”),而不是按需分配和销毁它们。