我的API函数应该使用shared_ptr还是weak_ptr

时间:2018-01-31 08:06:41

标签: c++ shared-ptr weak-ptr

我目前正在设计API,但我不确定我的功能是应该采用shared_ptr还是weak_ptr。有些小部件包含查看器。观众有一个功能add_painter,它为观众添加了一个画家。当观众需要重绘时,它会使用画家绘制缓冲区并显示结果。我得出结论,观众应该使用weak_ptr

来抓住画家
  • 画家可能会在多个观众中使用,因此观众不能拥有画家。
  • 删除画家应将其从观看者中删除。这样,用户无需记住他们必须调用remove_painter函数。

可能有不同类型的观看者,因此它们隐藏在界面后面。哪个签名最适合界面中的add_painter函数?

我应该直接使用void add_painter(weak_ptr<Painter> const& p)吗?这意味着具体实现使用weak_ptr存储画家,但我不能强制执行此操作:实现只能执行painters.push_back(weak_ptr.lock())并存储shared_ptr

我应该使用void add_painter(shared_ptr<Painter> const& p)吗?这意味着观众拥有强大的引用,因此删除画家不一定会将其从观看者中删除。

我还考虑将画家直接存储在接口类中,但它不再是真正的接口了,是吗?

1 个答案:

答案 0 :(得分:1)

你不应该尝试使用智能指针来缓解Observer模式,当你的客户端(View)可以通过将弱指针转换为共享指针并无限期地存储它以阻止它被释放时,你应该避免这种情况。由服务器。

你应该在这里考虑经典的Observer模式,请求View提供painter_destroyed回调函数。这可能是一个烦恼,但也让客户有机会在画家被摧毁后实施一些额外的行动。否则,当人们想要使用它时,发现画家不再存在可能会非常刺激并影响整体节目的表现。