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(引 ...
随机推荐
- Hadoop Streaming 得到mapreduce_map_input_file中遇到的问题的版本号
1.Hadoop Streaming,您可以在任务获得hadoop设置环境变量, 例如,使用awk书面map从而能获得:filename = ENVIRON["mapreduce_map_i ...
- CodeForces 277A Learning Languages (并检查集合)
A. Learning Languages time limit per test:2 seconds memory limit per test:256 megabytes The "Be ...
- Xcode5和6共处,如何发布应用程序存储
怎样你和我一样手贱安装了Xcode6,同一时候又须要公布应用到商店时,你会发现打好的包是通只是审核的. 验证报错: unable to validate application archives of ...
- Linux访问Windows共享文件夹 (转)
在开发Linux程序中,经常会使用Windows的编辑器进行编辑,这样还要拷贝到Linux服务器,如果有这种开发习惯的同学,可以使用这种方式进行开发. 当然除了这种方法之外,可以再Windows安装n ...
- 为什么解析 array_column不可用,
不久前,自己在一个小项目,我要拿出每个元素的一维数组key的值,一维阵列的形成,突然想到php 有一种功能,实现. $array = array ( array ( "id" =& ...
- IOS 警告 收集
Semantic Warnings Warning Message -WCFString-literal input conversion stopped due to an input byte t ...
- DataTable转化为List
public List<T> ConvertToList<T>(DataTable dt) where T : new() { // 定义集 ...
- js调用wcf 的SOA
jquery 调用wcf 的SOA架构,将三层架构运用到SOA的架构中来 经过前面3天的学习,我想大家应该对SOA的架构有了初步的了解,其实 SOA与三层架构并不冲突,而是三层架构的升级版. 来看下传 ...
- 【百度地图API】你看过房产地图吗?你知道房产标注是如何建立的吗?
原文:[百度地图API]你看过房产地图吗?你知道房产标注是如何建立的吗? 你是不是看过很多房产网站?例如安居客,新浪乐居. 你是不是也想做一个能写文字的标注? 你知道怎么去实现麼? 其实,上图这样的标 ...
- __doPostBack 未生成
事情是这样的: asp.net 项目 采用了 DevExpress 第三方控件,然后 网站架设在 win2003 服务器上面. 本地测试 都是 OK的,然而 ,在服务器 上面 却出现了 __doP ...