Effective C++(15) 在资源管理类中提供对原始资源的访问
std::tr1::shared_ptr<Investment> pInv(createInvestment()); //加入有某个函数,用来处理Investment对象,像下面这样
int daysHeld(const Investment* pi); // 返回投资天数 //那么像下面这样的调用时错误的
int days = daysHeld(pInv);
有两个做法可以达到这个目标:显示转换和隐式转换。
显示转换
int days = daysHeld(pInv.get()); // 将pInv内的原始指针传给了daysHeld
class Investment
{
public:
bool isTaxFree() const; // 被管理资源内部定义的一个方法
... ...
}; /*使用*/
Investment* createInvestment();
std::tr1:;shared_ptr<Investment> pi1(createInvestment());
bool taxable = !(pi1->isTaxFree());
......
std::auto_ptr<Investment> pi2(createInvestment());
bool taxable = !((*pi2).isTaxFree());
......
如果让你设计一个RAII class,可能会像下面这个管理字体资源的例子中那样,提供一个显式转换或者隐式转换。
// 类设定
FontHandle getFont(); // 获取字体资源函数
void releaseFont(FontHandle fh); // 释放字体资源 class Font
{
public:
explicit Font(FontHandle fh)
: f(fh)
{ }
~Font()
{
releaseFont(f);
}
private:
FontHandle f;
}; /*使用该类*/
// 假如有大量与字体相关的C API,它们处理的是FontHandles,那么“将Font对象转换为FontHandle”会是一种很频繁的需求。 // 提供一个显式转换
class Font
{
public:
... ...
FontHandle get() const { return f; } // 显示转换函数
... ...
}; // 使用该显式转换
void changeFontSize(FontHandle f, int newSize); // C API(系统给定) Font f(getFont());
int newFontSIze;
... ...
changeFontSize(f.get(), newFontSize); // 频繁地调用这个get方法会让人容易厌烦
// 下面提供一个隐式转换
class Font
{
public:
...
operator FontHandle() const { return f; }
...
}; //使用该隐式转换
Font f(getFont());
int newFontSize;
...
changeFontSize(f, newFontSize); // 但是这个隐式转换会增加错误发生机会
Font f1(getFont());
...
Font f2 = f1; // 本意死打算拷贝一个Font对象,结果却将f1隐式转换为底部的FontHandle才复制,编译不通过
FontHandle f3 = f1; // 现在类型匹配没问题了吧,但是当f1被销毁,其内部的资源也同时被销毁,那么这个f3指向的资源也同时被释放。
- APIs往往要求访问原始资源,所以,每一个资源管理类应该提供一个取得其所管理的资源的方法。
- 对原始资源的访问可能经由显示转换或隐式转换。一般而言,显式转换比较安全,但隐式转换对客户比较方便。
Effective C++(15) 在资源管理类中提供对原始资源的访问的更多相关文章
- [Effective C++ --015]在资源管理类中提供对原始资源的访问
引言 资源管理类是防止资源泄漏的有力武器,但是许多APIs直接指涉资源,除非你发誓永不使用这样的APIs,否则只得绕过资源管理对象(resource-managing objects)直接访问原始资源 ...
- Effective C++ 条款15、16 在资源管理类中提供对原始资源的访问||成对使用new 与 delete要采取相同形式
1.在资源管理类中提供对原始资源的访问 前几个条款很棒,它们是对抗资源泄露的壁垒,但很多APIs直接指向 资源,这个时候,我们需要直接访问原始资源. 这里,有两种方法解决上述问题,我们 ...
- Effective C++ -----条款15:在资源管理类中提供对原始资源的访问
APIs往往要求访问原始资源(raw resources),所以每一个RAII class应该提供一个“取得其所管理之资源”的办法. 对原始资源的访问可能经由显示转换(.get()成员函数或者指针取值 ...
- 条款15:在资源管理类中提供对原始资源的访问(Provide access to raw resources in resource-managing classes)
NOTE: 1.APIs往往要求访问原始资源(raw resources),所以每一个RAII class应该提供一个“取得其所管理之资源”的办法. 2.对原始资源的访问可能经由显示转换或隐式转换.一 ...
- 读书笔记_Effective_C++_条款十五:在资源类管理类中提供对原始资源的访问
void f(int* a) { cout <<* a << endl; } int main() { shared_ptr<int> p(new int(3)); ...
- 读书笔记 effective c++ Item 15 在资源管理类中提供对原生(raw)资源的访问
1.为什么需要访问资源管理类中的原生资源 资源管理类是很奇妙的.它们是防止资源泄漏的堡垒,没有资源泄漏发生是设计良好的系统的一个基本特征.在一个完美的世界中,你需要依赖这样的类来同资源进行交互,绝不 ...
- effective条款15,在资源管理类中小心copying行为
class A { private: int *p; void lock(){ cout << p << "is lock" << endl; ...
- Effective C++(14) 在资源管理类中小心copying行为
问题聚焦: 上一条款所告诉我们的智能指针,只适合与在堆中的资源,而并非所有资源都是在堆中的. 这时候,我们可能需要建立自己的资源管理类,那么建立自己的资源管理类时,需要注意什么呢?. ...
- [Effective C++ --014]在资源管理类中小心copying行为
第一节 <背景> 条款13中讲到“资源取得的时机便是初始化时机”并由此引出“以对象管理资源”的概念.通常情况下使用std中的auto_ptr(智能指针)和tr1::shared_ptr(引 ...
随机推荐
- poj 1698 Alice's Chance 拆点最大流
将星期拆点,符合条件的连边,最后统计汇点流量是否满即可了,注意结点编号. #include<cstdio> #include<cstring> #include<cmat ...
- ORA-07445: :一个意料之外的问题发生了 核心转储 [ldxsnf()+625] [SIGSEGV
ALERT登录错误消息: Mon Jan 20 15:03:22 2014 Incremental checkpoint up to RBA [0x442f.abd.0], current log t ...
- TableLayout中stretchColumns、shrinkColumns的使用方法
android:stretchColumns="1" android:shrinkColumns="1"这两个属性是TableLayout所特有的,也是这两个属 ...
- WebService返回DataTable问题
今天做项目时,想在WebService中返回DataTable,在单位没成功,看网上有人说datable在.net1.1中是没有序列化的,不能直接在webservice中返回,可以返回dataset. ...
- php_json入库有关
php入库json信息 有些字符需要特殊处理 //组装 $test=array(); $test["k1"]= urlencode($k1); $test["k2&quo ...
- linux_曝出重大bash安全漏洞及修复方法
日前Linux官方内置Bash中新发现一个非常严重安全漏洞(漏洞参考https://access.redhat.com/security/cve/CVE-2014-6271 ),黑客可以利用该Bas ...
- CSS hack 如何区分所有IE浏览器和非IE浏览器
网上方法很多,例如,测试后得出以下结论,多余的话不说了,直入主题: 1.所有的推理IE浏览器 正解:此写法仅仅被lE浏览器识别,非IE浏览器不识别. <!--[if IE]> <st ...
- hdu(2062)-Subset sequence 组合数学
意甲冠军:查找集合{1,2,3...n}第一m一个排列子. 收集的线索所行的大小. 例两个元素的排列子集合按字典树排列是:{1},{1,2},{2},{2,1}: 解法:一个一个元素来确定,每次把剩余 ...
- installshield制作的安装包卸载时提示重启动的原因以及解决办法
原文:installshield制作的安装包卸载时提示重启动的原因以及解决办法 有时候卸载installshield制作的安装包程序,卸载完会提示是否重启电脑以完成所有卸载,产生这个提示的常见原因有如 ...
- navigator,JS检测浏览器插件
最早由Netscape Navigator 2.0引入的navigator对象,现在已经成为识别客户端浏览器的事实标准.虽然其它浏览器也通过其它方式提供了相同或相似的信息(例如,IE中的window. ...