条款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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值