《Effective C++》条款15:使用资源管理类提供对原始资源的访问
一直觉得可能这种方法破坏了对于原始资源的封装性,但是书上的一句话说的特别好:资源管理类并不是为了封装而存在的,是为了delete而存在的;
所以,返回原始资源的访问,并不算破坏封装性;
原始资源的使用往往和C API接口有关,所以本章节给出了几个例子,如何返回原始资源;
针对于智能指针而言:
Investment* createInvestment(); auto_ptr<Investment> pInv(createInvestment()); Investment* ppInv = pInv.get();
使用auto_ptr的get()函数可以有效地得到初始资源;
shared_ptr同理,可以根据函数进行不同的操作;
针对于显式直接返回而言:
如下所示,直接设置一个函数返回最初资源即可:
class Font {
public:
explicit Font(Investment Inv) :INV(Inv) {};
~Font(){
//release Font;
}
Investment get() const {
return INV;
}
private:
Investment INV;
};
针对于隐式转换而言:
这种形式比较少见,意在当遇到类型不匹配时,由编译器自己进行类型转换,无需调用其他函数;
class Font {
public:
explicit Font(Investment Inv) :INV(Inv) {};
~Font(){
//release Font;
}
operator Investment() const {
return INV;
}
private:
Investment INV;
};
这里注意下隐式转化的写法;
对于显式和隐式各有优劣:
显式可以很好的避免隐式类型转化而引起的未知错误,清晰,但是用户调用麻烦;
隐式调用方便,但是容易造成不注意隐式转换而带来的错误;

浙公网安备 33010602011771号