条款15:在资源管理类中提供对原始资源的访问

APIs往往要求访问原始资源(raw resource),所以每一个RAII class应该提供一个“取得管理资源”的办法

对原始资源的访问可以有显式转换和隐式转换。
显式转换比较安全;
隐式转换比较方便;

显式转换:
智能指针的get()函数
隐式转换:
智能指针的operator->和operator*

FontHandle getFont(); //C API
void releaseFont(FontHandle fh); //C API
void changeFontSize(FontHandle f, int newSize);//C API

//自定义RAII资源管理类
class Font{
public:
	explicit Font(FontHandle fh):f(fh){}//pass-by-value C API这样做
	~Font(){releaseFont(f);} //释放资源
	FontHandle get()const {return f;}//显式转换
	operator FontHandle() const{return f;}//隐式转换
private:
	FontHandle f;//原始资源
};

//调用
Font f(getFont());
int size;
...
changeFontSize(f.get(), size);//显式调用
changeFontSize(f, size);//隐式调用,方便

//隐式误用
Font f1(getFont());
...
FontHandle f2 = f1;//想拷贝一个Font对象,却将f1隐式转换后复制

boost::shared_ptr的显式bool值转型

explicit operator bool() const;

猜你喜欢

转载自blog.csdn.net/lzhtcsw2016/article/details/88417419