用UML绘制智能指针
Drawing Smart Pointers in UML
在UML类图中,是否有一种公认的方法来描述共享指针(boost::shared_ptr
或std::shared_ptr
)所持有的对象?特别是,应该使用空的或全的类金刚石聚集物或成分吗?
我不知道关于如何将智能指针建模为关系的总体共识。
黑钻石意味着控制寿命,白钻石意味着不控制寿命,所以你可以在当地同意使用黑钻石表示unique_ptr,所有黑钻石表示shared_ptr,白钻石表示weak_ptr。
如果你真的想为smart_ptr建模,我建议你在关系中添加一个属性类:
0
| /----------------
+--+ shared pointer |
| ----------------/
V
您的UML类模型应该是抽象的,并且没有语言习惯用法。
在实践中,您可以为每种类型的智能点创建一个关系的原型,其中包括OCL约束。我对每个智能指针子类型的具体语义还不够熟悉,无法提供详细信息,但OCL规范应该会有所帮助。
UML不仅仅是用于指定具体实现,而是用于设计解决方案。这就是为什么大多数C++语言/库特性和UML之间没有一一对应的关系。
但是UML在它的使用上和在编程语言上一样是不可知的。这里有一些提示:
-
shared_ptr<T>
意味着几个对象可以指向T
的同一个实例,如果没有对象再指向该实例,则该实例将被销毁。这在UML中对应于简单关联的情况,只是UML没有说明垃圾收集。 -
智能指针保证在运行时进行高效访问。因此,您可以使用可导航关联(打开
T
侧的箭头)。一个更好的选择是使用点符号来显示关联端的所有权(T侧的一个小点,拥有的端总是可导航的,因此打开的箭头将是多余的)。 -
有些人会声称
shared_ptr<T>
实现了共享聚合,应该在T
的对侧使用空心菱形进行建模我们既不能否认也不能证实这样的声明:UML 2.5.1没有为共享聚合定义任何特殊的语义。因此,使用它并没有错,但它仍然模糊不清:Shared:表示属性具有共享聚合语义。共享聚合的精确语义因应用领域和建模者而异。
-
有些人建议用自定义的刻板印象
«shared_ptr»
来注释关联或聚合。我强烈建议不要使用这种极其模糊的做法:关联有两端,在一端使用shared_ptr
并不意味着它也在另一端使用(可能是weak_ptr
、unique_ptr
,甚至什么都没有) -
以上所有内容都将无差别地应用于原始指针和共享指针。如Martin所建议的,仅在一个方向上区分链接的唯一剩余方法是对属性或角色(在关联端)使用约束。幸运的是,这些可以用纯文本表达,并且不必是有效的OCL。因此,
{shared}
或{shared_ptr}
作为快捷方式意味着属性/关联{ must be implemented with a shared pointer }
似乎完全可以接受。但if并不是一种广泛使用的做法。
最后但同样重要的是,即使复合聚合不太可能,也不能完全排除它:您的代码可以使用shared_ptr
,但要通过其他方式确保对象实际上在任何给定时间只在一个地方使用。这让我有机会回到我最初的陈述:使用UML来解释你的设计意图,而不是盲目而痛苦地记录一些代码;-)
- 1d 智能指针不适用于语法 (*)++
- 优先顺序:智能指针和类析构函数
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 智能指针作为无序映射键,并通过引用进行比较
- 智能指针概念所有权和寿命
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- 尝试使用智能指针时引发异常
- 我可以制作指向智能指针的智能指针吗?
- 通过智能指针和转换对基本模板参数进行模板推导
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 从堆栈分配的原始指针构造智能指针
- 初始化指向类实例的智能指针并访问其方法
- 如何使用 std::make_shared 创建基类类型的智能指针?
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 编译器不会使用 -std=c++11 编译智能指针
- 具有智能指针的多态性
- C++:矢量分配器行为、内存分配和智能指针
- 通过简单的包装指针C++智能指针性能和差异
- 矢量中的自动指针(智能)
- Std::vector的对象/指针/智能指针传递对象(总线错误:10)