资源管理类是对抗资源泄漏的有效手段,你依赖这个类的操作来代替本来应该手动处理资源的繁琐操作。
但是这样并不完美,应该有些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();
- 隐式转换
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.一般显式转换比较安全,隐式转换对客户来说用起来方便。
网友评论