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

Should my API functions take shared_ptr or weak_ptr

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

抱住画家

可能有不同类型的查看器,所以他们隐藏在一个界面后面。什么签名最适合界面中的 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) 吗?这意味着观看者持有强引用,因此删除画家并不一定将其从观看者中删除。

我也考虑过直接在界面中存储画师class,但是这样就不是真正的界面了,是吗?

你不应该尝试用智能指针来缓解观察者模式,你绝对应该避免客户端(View)通过将弱指针转换为共享指针并无限期地存储它来阻止它来骚扰服务器的情况被服务器释放。

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