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

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

shared_ptr<Investment> 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.一般显式转换比较安全,隐式转换对客户来说用起来方便。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容