c++使对象依赖于其他对象是一种好的设计
C++ Is making objects depend on others a good design?
我有一个由三个类组成的基本设计:一个数据类,一个持有和管理多个数据对象的Holder类,以及一个由Holder返回的包含对数据对象引用的Wrapper。
问题是Wrapper不能比Holder活得长,否则它将包含一个悬空引用,因为Holder负责删除Data对象。但是,由于Wrapper 打算具有非常短的生命周期(将其置于函数中,对其数据进行一些计算,并让它超出作用域),因此应该不是问题,但我不确定这是一个好的设计。以下是我想到的一些解决方案:
-依赖于阅读文档的用户,技术上STL迭代器也会发生同样的事情
-使用shared_ptr来确保数据持续足够长的时间,但感觉有点过头了
-使包装器验证它的持有人仍然存在,每次你使用它
任何其它想法?
(我希望大家都能理解,因为英语不是我的母语)
编辑:如果你想有一个较少的理论方法,这一切都来自一个小算法,我试图写解决数独,持有人是网格,数据是每个盒子的内容(无论是结果或临时假设),包装器是一个盒子类,其中包含对数据的引用,加上行和列等附加信息。我本来并没有这么说,因为我想知道在更一般的情况下该怎么做。
仅按值返回Wrapper
将有助于确保调用者不会在调用范围之外保留它。结合注释或文档"包装器仅在创建它们的Holder的生命周期内有效"应该就足够了。
或者您决定在创建Wrapper
时将Data
的所有权转移到Wrapper
,并且Data
与Wrapper
一起被销毁-但是如果您想要销毁Wrapper
而不删除Data
怎么办?您需要一个方法来选择性地将Data
的所有权交还给Holder
。
无论你选择哪一个,你都需要决定什么拥有(即:对Data
的生命周期负责)以及何时- 一旦你做到了,如果你愿意,你可以使用智能指针来帮助管理-但他们不会为你做出设计决定,你不能简单地说"哦,我将使用智能指针而不是考虑它"。
要详细说明您已经列出的选项,
-
如您所建议,
shared_ptr<Data>
是一个很好的选择。 -
永远不要在
Wrapper
中保留指向Data
的指针。存储一个句柄,该句柄可用于获取指向相应Data
对象的指针。在通过Wrapper
访问Data
之前,获取Data
对象的指针。如果指针无效,抛出一个exception
。
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 有没有一种简单的方法可以在对象向量上调用构造函数?
- 有没有一种方法可以从函数中返回一个新对象或对现有对象的引用
- C++中有没有一种方法可以通过指定列表中的每个成员变量来构造对象
- 是否有一种设计模式或面向对象的基本原则来处理这种共享资源的情况?
- 如何在一种方法中创建对象并在另一种方法中使用它
- 将空基类优化对象强制转换为另一种类型是否会破坏严格的别名?
- 是否有一种方法可以根据派生的可能性值范围限制对象参数
- 如何将对象定义为一种类型,然后再将其声明为子类型
- 有没有一种方法可以使用__declSpec(Align)来声明具有不同类型的对象
- 是否有一种计算CGAL中Surface_mesh对象的PCA的方法
- C++ - 在类中包含不是类对象属性的变量是否是一种不好的做法
- 故意对对象切片是一种可行的技术吗?
- 是否有一种有效的方法可以将一系列对象与父/子关系分类
- (C )正在创建专门用于处理所有其他自定义对象的类/对象一种处理项目的正确方法
- 如果要调用多个成员函数,对象编辑器是否是一种好方法?
- 有没有一种方法可以将升压信号和插槽与不可复制的对象一起使用
- 是否有一种方法可以专门使用继承对象的一般方法
- 是否有一种简单的方法可以在运行时在C 中创建/名称对象
- C 双重调度,出厂模式或一种从接收到的序列数据创建派生对象的方法