让包装共享句柄的类可复制是否可以接受 C++ 风格?
我经常发现自己编写的类通过在类接口后面保存一个 shared_ptr 来隐藏一些粗糙的 C 库或 OS 资源的细节。例如
class window
{
public:
window() : m_handle(OsCreateWindow(), OsDestroyWindow) {}
void make_it_dance();
void paint_it_red();
private:
shared_ptr<OS_WINDOW_HANDLE> m_handle;
}
因为类是可复制的并且shared_ptr
可以完成繁重的工作,所以实例可以随意传递,没有任何东西泄漏或被破坏两次。所以,从技术上讲,一切都很好。我多年来一直这样做。
但最近我开始怀疑这是否真的是很好的风格。毕竟,当类实例复制时,句柄末尾的对象并没有被复制。让所有这些类都不可复制,让用户非常清楚他们正在处理对同一对象的引用会更好吗?现代 C++ 非常重视“基于价值”,而在实例之间共享后端资源似乎违背了这一原则。
然而,结果是我的大部分代码都会处理指针,即使它们是智能指针。这似乎是倒退了一步。