主题:资源管理类中提供直接访问底层资源的机制。
资源管理类能防止资源泄漏。理想情况下,我们均采用资源管理类与底层资源交互。但是,许多API需要直接访问底层资源,所以需要提供直接访问底层资源的机制。
有两个方法将资源管理类转换为底层资源:显式转换(explicit conversion)和隐式转换(implicit conversion)。
auto_ptr和shared_ptr都有一个get函数提供显式转换。有的程序采用隐式的转换函数,这样就不必到处调用get了,但是隐式转换的缺点是增加了错误的机会,Meyers举了复制Font对象被误写为复制底层Font句柄,可能导致资源释放后f2悬挂(dangle)的问题。
通常情况下,优先考虑使用显示转换,因为它更安全。
最后,Meyers指出:从资源管理类中返回底层资源破坏了封装原则,但是资源管理类的存在不是为了封装,而是为了确保资源被适时地释放,因此这不是错误的设计。
附:两种隐式转换的方式:
1) class Font {
public:
operator FontHandle() const { return f; } // implicit convert from Font to FontHandle
};
2) class Font {
public:
Font(FontHandle fh) {.....} // implict convert from FontHandle to Font
};