15. Provide access to raw resources in resouce-managing classes
在资源管理类中提供对原始资源的访问
资源管理类必须提供原始对象的访问接口,以便直接访问资源。
智能指针std::shared_ptr就提供成员函数get()访问原始资源。
Font GetFont() { ... } // 获取Font全局函数
ReleaseFont(Font ft) { ... } // 释放Font全局函数
ChangeFontSize(Font ft) { ... }class Font
{}class FontHandle
{public:Font Get() { return m_font; } // operator Font() { return m_font; } // 隐式类型转换操作符private:Font m_font;
}
...
FontHandle handle(GetFont()); // 1
ChangeFontSize(handle.Get()); // 2
// ChangeFontSize(handle); // 3
...
第2行中调用handle.Get()返回Font对象。如果想要FontHandle对象可以直接转换成为Font对象,可以实现其隐式类型转换操作符 operator Font (),其调用方式就变成了第3行。
当然,存在隐式类型转换操作符可能会带来意向不到的结果。
是否该提供一个显示转换函数(例如get成员函数)将RAII class转换为其底部资源,或是应该提供隐式转换,答案主要取决于RAII class别设计执行的特定工作,以及它被使用的情况。最佳设计很可能是坚持条款18的忠告:”让接口容易被正确使用,不易被误用“。通常显示转换函数如get是比较受欢迎的路子。以为它将“非故意之类型转换”的可能性最小化了。然后有时候,隐式类型转换所带来的”自然用法“也会引发天枰倾斜。
请记住:
- APIs往往要求访问原始资源(raw resources), 所以每个RAII class应该提供一个“取得其所管理之资源”的办法。
- 对原始资源的访问可能经由显示转换或隐式转换,一般而言显示转换比较安全,但隐式转换对客户比较方便。
15. Provide access to raw resources in resouce-managing classes相关推荐
- 15、Access数据库偏移注入
前言 本来想好好介绍一下Access数据库的偏移注入,找个目标来试试,但是找了好久都没有找到,又想自己要不在本地搭建一个?额...还是算了吧,没有太多的时间,之后在网上搜索了一些"偏移注入& ...
- Mongoose provide access to previous value of property in pre('save')
Mongoose allows you to configure custom setters in which you do the comparison. pre('save') by itsel ...
- 《Effective C++》》阅读笔记
第一章 Accustoming Yourself to C++ 1 View C++ as a federation of language (1). ...
- Effective C++ 改善55个方法
美·Scott Meyers 候捷 电子工业 2011 刚才看到个会议时间有点晚,3.25论文都提交了 谷歌去广告的插件, 最后投了这个会议,刚刚好正合适.我说金钱与时间 ACCUSTOMING YO ...
- Effective C++读书笔记 摘自 pandawuwyj的专栏
Effective C++读书笔记(0) Start 声明式(Declaration):告诉编译器某个东西的名称和类型,但略去细节. std::size_t numDigits(i ...
- Effective C++改善程序与设计的55个具体做法笔记
Scott Meyers大师Effective三部曲:Effective C++.More Effective C++.Effective STL,这三本书出版已很多年,后来又出版了Effective ...
- Effect C++ 学习笔记三:资源管理
资源:内存,文件描述器,互斥锁,图形界面的字体和笔刷,数据库链接,socket等. 十三:Use objects to manage resources. 以对象管理资源 class Investme ...
- pet 计算机术语,计算机专业英语翻译1?计算机专业英语翻译1、Tobecompet 爱问知识人...
计算机专业英语翻译 1.To be competent with computer technology,you need to know the five parts of an informati ...
- Fuchsia Fundamentals
根据官方文档等挖掘Fuchsia特性以及和传统linux的区别 Introduction to Fuchsia 1. Fuchsia architecture [外链图片转存失败,源站可能有防盗链机制 ...
- Spring Core之 Customizing the Nature of a Bean(自定义bean的相关性质)
文章目录 一.Lifecycle Callbacks (生命周期回调函数) 1.Initialization Callbacks(初始化回调) 2.Destruction Callbacks(销毁回调 ...
最新文章
- 五分钟搭建BERT服务,实现1000+QPS​,这个Service-Streamer做到了
- JS~对img标签进行优化,使用onerror进行默认图像显示
- 我对浮动的认识(一)
- 数学建模中的excel操作
- webpack从入门到精通(四)优化打包配置总结②
- C++堆排序(附完整源码)
- MySQL+HandlerSocket=MySQL的功能+NoSQL的性能
- Codeforces Round #632 (Div. 2) C. Eugene and an array 思维 + 前缀和
- 漫画:什么是机器学习
- 指定的颜色信息显示方法
- 简述隐含表法化简状态步骤
- 为所有北京奥运冠军名字作诗(诗集)
- php调用海康人脸识别摄像机,海康网络摄像机SDK对接
- 前端,你需要掌握的重点!!
- 应用层故事难讲 公链集体押注DeFi背后 是黔驴技穷的无奈之举?
- CentOS 下安装Mplayer播放器(转载)
- C++题目分享之锯木头
- 3Dtouch 基本原理
- 网络-数据链路层回顾
- 阿里修炼秘籍,如何快速成长的几个技巧?
热门文章
- Mysql DBA 高级运维学习之路-DML语句之insert知识讲解
- 算法和数据结构~Sqlserver索引使用的B树
- Angular 在洋葱圈的实践与思考
- C语言的变量的作用域和生存期
- [转]ios面试题收集(二)
- 10. Zend_Loader
- 100. SimpleXML
- android jni 结构体_中高级安卓开发技术!Android开发核心知识笔记共2100页,完整版开放下载...
- css3中word-wrap与wrod-break的区别
- script片段在前导致对下文的html元素引用失效