effective C++ 笔记:条款15 在资源管理类中提供对原始资源的访问

资源管理类是对抗资源泄漏的有效手段,你依赖这个类的操作来代替本来应该手动处理资源的繁琐操作。
但是这样并不完美,应该有些API直接使用资源,举个例子:

shared_ptr pInv(createInvestment()); //见条款13
int days(const Investment* p);                  //一个直接调用Investment对象的函数
int d = days(pInv);                           //错误,pInv类型不是 Investment*

这时候有两种办法:1)显式转换 2)隐式转换

1)显式转换
shared_ptr 和 auto_ptr都提供了一个get成员函数,可以获得智能指针内部的原始指针的拷贝:

int days = days(pInv.get());

并且重载了->和*

pInv->fun();    //fun()是Investment类中的函数
(*pInv).fun();
  1. 隐式转换
class Font{
public:
    ...
    operator FontHandle() const{ return f;}
private:
    FontHandle f;
};

Font F;
void fun(FontHandle f); //fun函数声明
fun(F);                //这样就可以将F中的f传给fun

但是这里有一个问题,见如下代码:

Font F;
FontHandle f2 = F;  //这里程序员本意是想拷贝一个Font对象,却错写成了FontHandle

这样错误地得到了一个FontHandle对象,当F被释放的时候,实际上f2的内容其实也已经被销毁了。

总结:
1.资源管理类应该提供一个能够取得其所管理的资源的方法。
2.一般显式转换比较安全,隐式转换对客户来说用起来方便。

你可能感兴趣的:(effective C++ 笔记:条款15 在资源管理类中提供对原始资源的访问)