我的 API 函数应该shared_ptr还是weak_ptr
Should my API functions take shared_ptr or 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)
吗?这意味着观众拥有很强的参考,因此删除画家并不一定将其从观看者中删除。
我也考虑过将画家直接存储在接口类中,但后来它不再是真正的接口了,是吗?
您不应该尝试使用智能指针来缓解观察者模式,并且绝对应该避免客户端(View)通过将弱指针转换为共享指针并无限期存储它来骚扰服务器的情况,以防止服务器释放它。
您确实应该考虑此处请求 View 提供painter_destroyed
回调函数的经典观察者模式。这可能是一个烦恼,但也让客户有机会在画家被摧毁后实施一些额外的行动。否则,发现画家不再存在,只是当人们想使用它时,可能会非常烦人并影响整体程序性能。
相关文章:
- enum是C++中的宏变量还是整数变量
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 在命名空间中定义函数还是限定函数
- 架构决策:返回std::future还是提供回调
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 异常属于C++中的线程还是进程
- 在决定是通过参考还是通过价值时,尺寸真的是一个问题吗
- 如何在C++中确定文本文件中的元素是字符还是数字
- 返回值优化:显式移动还是隐式
- CLANG 编译器 说:变量"PTR"可能未初始化
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 为什么需要知道一个类是平凡的还是有平凡的构造函数
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 'string.assign(string.data(), 5)' 是明确定义的还是 UB?
- 在哪里放置我的函数?进入我的母语 Gui 还是进入我的演示者?
- 在这种情况下,我真的复制了字节还是复制了字符?
- node-gyp 的先有鸡还是先有蛋的问题:指向依赖项中的头文件
- CIN是逻辑1还是0?