c++使对象依赖于其他对象是一种好的设计

C++ Is making objects depend on others a good design?

本文关键字:对象 一种 依赖于 其他 c++      更新时间:2023-10-16

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

问题是Wrapper不能比Holder活得长,否则它将包含一个悬空引用,因为Holder负责删除Data对象。但是,由于Wrapper 打算具有非常短的生命周期(将其置于函数中,对其数据进行一些计算,并让它超出作用域),因此应该不是问题,但我不确定这是一个好的设计。以下是我想到的一些解决方案:
-依赖于阅读文档的用户,技术上STL迭代器也会发生同样的事情
-使用shared_ptr来确保数据持续足够长的时间,但感觉有点过头了
-使包装器验证它的持有人仍然存在,每次你使用它
任何其它想法?

(我希望大家都能理解,因为英语不是我的母语)

编辑:如果你想有一个较少的理论方法,这一切都来自一个小算法,我试图写解决数独,持有人是网格,数据是每个盒子的内容(无论是结果或临时假设),包装器是一个盒子类,其中包含对数据的引用,加上行和列等附加信息。我本来并没有这么说,因为我想知道在更一般的情况下该怎么做。

仅按值返回Wrapper将有助于确保调用者不会在调用范围之外保留它。结合注释或文档"包装器仅在创建它们的Holder的生命周期内有效"应该就足够了。

或者您决定在创建Wrapper时将Data的所有权转移到Wrapper,并且DataWrapper一起被销毁-但是如果您想要销毁Wrapper而不删除Data怎么办?您需要一个方法来选择性地将Data的所有权交还给Holder

无论你选择哪一个,你都需要决定什么拥有(即:对Data的生命周期负责)以及何时- 一旦你做到了,如果你愿意,你可以使用智能指针来帮助管理-但他们不会为你做出设计决定,你不能简单地说"哦,我将使用智能指针而不是考虑它"。

请记住,如果你不能用智能指针来管理堆内存,那么你也没有必要用来管理堆内存 !

要详细说明您已经列出的选项,

  1. 如您所建议,shared_ptr<Data>是一个很好的选择。

  2. 永远不要在Wrapper中保留指向Data的指针。存储一个句柄,该句柄可用于获取指向相应Data对象的指针。在通过Wrapper访问Data之前,获取Data对象的指针。如果指针无效,抛出一个exception

相关文章: