Effective-cpp-#15

provide access to raw resources in resource-managing classes

动机

在条款13中,我们使用智能指针去保存一个原始资源,但有些时候AP需要绕过诸如智能指针这类资源管理对象去获得原始资源,因此我们需要留下一个途径让API有机会去使用原始资源

方法

  • get()方法

在shared_ptr和auto_ptr中都提供了一个get成员函数,用来显式地返回智能指针内部的资源

1
int days = daysHeld(pInv.get())//shared_ptr<Investment> pInv
  • 提供隐式转换
1
2
3
4
5
6
7
class Font{
public:
explict Font(FontHandle fh):f(fh){}
~Font() {releaseFont(f);}
private:
FontHandle f;
}

在上述RAII类中,每次要使用原始资源,都必须要利用get()方法;因此我们可以提供一个隐式的转换

1
2
3
4
5
6
class Font{
public:
...
operator FontHandle() const{return f;}
...
}

建议

  • RAII类应该提供一个访问原始资源的接口,这虽然会破环类的封装,但因为RAII的目的是保证资源的正确释放,所以影响不大
  • 对资源的访问可以通过显示转换或隐式转换,个人建议显式转换,比较安全