C ++是否使对象依赖于其他好的设计?

时间:2015-07-29 15:01:07

标签: c++ oop

我有一个由三个类组成的基本设计:一个Data类,一个持有和管理多个Data对象的Holder类,以及一个包含对Data对象的引用的Holder返回的Wrapper。

问题是Wrapper不能超过Holder,否则它将包含悬空引用,因为Holder负责删除Data对象。但是由于Wrapper 意图具有非常短的生命周期(在函数中获取它,对其数据进行一些计算,并让它超出范围),这个应该不是问题,但我不确定这是一个好的设计。

以下是我想到的一些解决方案:
- 依据用户阅读文档,技术上与STL迭代器相同的事情发生了 - 使用shared_ptr确保数据持续很长时间,但感觉就像是矫枉过正 -Make Wrapper每次使用时验证其持有人是否仍然存在 - 任何想法?

(我希望每个人都能理解这一点,因为英语不是我的母语)

编辑:如果你想要一个较少的理论方法,这一切都来自一个小算法,我试图写解决Sudokus,持有人是网格,数据是每个框的内容(结果或临时假设),Wrapper是一个Box类,它包含对数据的引用,以及行和列等附加信息。 我最初没有这么说,因为我想知道在更一般的情况下该怎么做。

2 个答案:

答案 0 :(得分:0)

详细说明您已列为选项的内容,

  1. 如您所知,shared_ptr<Data>是个不错的选择。除非性能是一个问题,否则你应该使用它。

  2. 永远不要在Data中指向Wrapper。存储一个句柄,可用于获取指向相应Data对象的指针。在通过Data访问Wrapper之前,获取Data对象的指针。如果指针无效,则抛出exception。如果指针有效,请沿着快乐路径前进。

答案 1 :(得分:0)

只有按值返回Wrapper才有助于确保来电者不会超出调用范围。与评论或文档相结合,&#34; Wrappers仅在创建它们的持有者的生命周期内有效。应该够了。

或者您决定Data的所有权在创建Wrapper时转移到WrapperData与{Wrapper一起销毁1}} - 但是如果你想在没有删除Wrapper的情况下销毁Data怎么办?您需要一种方法来有选择地将Data的所有权放回Holder

无论你选择哪一种,你都需要决定拥有什么(即:负责生命周期)Data以及何时 - 一旦你已经做到了,你可以,如果你想要,使用智能指针来帮助管理 - 但是他们不会为你做出设计决定,你不能简单地说'#34;哦,我会使用智能指针而不是思考它&#34;。

请记住,如果您无法管理堆内存而没有智能指针 - 您也无法管理堆内存 它们的业务!