在资源管理类中提供对原始资源的访问

资源管理类必须提供原始对象的访问接口,以便直接访问资源。
智能指针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相关推荐

  1. 15、Access数据库偏移注入

    前言 本来想好好介绍一下Access数据库的偏移注入,找个目标来试试,但是找了好久都没有找到,又想自己要不在本地搭建一个?额...还是算了吧,没有太多的时间,之后在网上搜索了一些"偏移注入& ...

  2. 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 ...

  3. 《Effective C++》》阅读笔记

    第一章    Accustoming Yourself to C++ 1           View C++ as a federation of language (1).             ...

  4. Effective C++ 改善55个方法

    美·Scott Meyers 候捷 电子工业 2011 刚才看到个会议时间有点晚,3.25论文都提交了 谷歌去广告的插件, 最后投了这个会议,刚刚好正合适.我说金钱与时间 ACCUSTOMING YO ...

  5. Effective C++读书笔记 摘自 pandawuwyj的专栏

    Effective C++读书笔记(0)       Start   声明式(Declaration):告诉编译器某个东西的名称和类型,但略去细节.   std::size_t numDigits(i ...

  6. Effective C++改善程序与设计的55个具体做法笔记

    Scott Meyers大师Effective三部曲:Effective C++.More Effective C++.Effective STL,这三本书出版已很多年,后来又出版了Effective ...

  7. Effect C++ 学习笔记三:资源管理

    资源:内存,文件描述器,互斥锁,图形界面的字体和笔刷,数据库链接,socket等. 十三:Use objects to manage resources. 以对象管理资源 class Investme ...

  8. pet 计算机术语,计算机专业英语翻译1?计算机专业英语翻译1、Tobecompet 爱问知识人...

    计算机专业英语翻译 1.To be competent with computer technology,you need to know the five parts of an informati ...

  9. Fuchsia Fundamentals

    根据官方文档等挖掘Fuchsia特性以及和传统linux的区别 Introduction to Fuchsia 1. Fuchsia architecture [外链图片转存失败,源站可能有防盗链机制 ...

  10. Spring Core之 Customizing the Nature of a Bean(自定义bean的相关性质)

    文章目录 一.Lifecycle Callbacks (生命周期回调函数) 1.Initialization Callbacks(初始化回调) 2.Destruction Callbacks(销毁回调 ...

最新文章

  1. 五分钟搭建BERT服务,实现1000+QPS​,这个Service-Streamer做到了
  2. JS~对img标签进行优化,使用onerror进行默认图像显示
  3. 我对浮动的认识(一)
  4. 数学建模中的excel操作
  5. webpack从入门到精通(四)优化打包配置总结②
  6. C++堆排序(附完整源码)
  7. MySQL+HandlerSocket=MySQL的功能+NoSQL的性能
  8. Codeforces Round #632 (Div. 2) C. Eugene and an array 思维 + 前缀和
  9. 漫画:什么是机器学习
  10. 指定的颜色信息显示方法
  11. 简述隐含表法化简状态步骤
  12. 为所有北京奥运冠军名字作诗(诗集)
  13. php调用海康人脸识别摄像机,海康网络摄像机SDK对接
  14. 前端,你需要掌握的重点!!
  15. 应用层故事难讲 公链集体押注DeFi背后 是黔驴技穷的无奈之举?
  16. CentOS 下安装Mplayer播放器(转载)
  17. C++题目分享之锯木头
  18. 3Dtouch 基本原理
  19. 网络-数据链路层回顾
  20. 阿里修炼秘籍,如何快速成长的几个技巧?

热门文章

  1. Mysql DBA 高级运维学习之路-DML语句之insert知识讲解
  2. 算法和数据结构~Sqlserver索引使用的B树
  3. Angular 在洋葱圈的实践与思考
  4. C语言的变量的作用域和生存期
  5. [转]ios面试题收集(二)
  6. 10. Zend_Loader
  7. 100. SimpleXML
  8. android jni 结构体_中高级安卓开发技术!Android开发核心知识笔记共2100页,完整版开放下载...
  9. css3中word-wrap与wrod-break的区别
  10. script片段在前导致对下文的html元素引用失效