C++箴言:在资源管理类中准备访问裸资源

C++箴言:在资源管理类中准备访问裸资源,第1张

C++箴言:在资源管理类中准备访问裸资源,第2张

资源管理课真的很棒。它们是防止资源泄漏的防波堤,没有这种泄漏是设计良好的系统的基本特征。在一个完美的世界里,你可以在所有与资源的交互中依赖这样的类,永远不需要通过直接访问*资源(原始资源)来玷污自己的双手。但是世界并不是完美的,很多API直接涉及资源,所以除非你打算坚决放弃使用这样的API(这样的东西很少变得实用),否则你往往会绕过资源管理类,直接处理*资源(原始资源)。

比如之前引入的像auto_ptr或者tr1::shared_ptr这样的智能指针,用来存放像CREATE INVESTMENT:STD::TR1::shared _ ptr inv(CREATE INVESTMENT())这样的调用工厂函数的结果;

假设您打算用于投资对象的函数如下所示:

int day sheld(const Investment * pi);//返回天数
//投资已持有

你会这样称呼它,

int days = day sheld(pInv);//错误!

但是这段代码无法编译:daysHeld需要一个* Investment*指针,但是你给它传递了一个tr1::shared_ptr类型的对象。

你需要一个方法把RAII类的对象(目前是tr1::shared_ptr)转换成它包含的*资源(比如底层投资*)。有两种传统的方法可以做到这一点。显式转换和隐式转换。

Tr1::shared_ptr和auto_ptr都提供了显示转换的get成员函数,即返回智能指针对象内部的原始指针(或其副本):

int days = day sheld(pinv . get());//好,将pInv中的原始指针
//传递给daysHeld

像几乎所有的智能指针类一样,tr1::shared_ptr和auto_ptr重载指针解引用操作符(operator->和operator*),这允许隐式转换到基础*指针:

class Investment { //层次结构的根类
public://of Investment types
bool istax free()const;
...
};
Investment * create Investment();//工厂函数

STD::tr1::shared _ ptr//have tr1::shared _ ptr
pi1(create investment());//管理资源

bool taxable1 =!(pi1-> isTaxFree());//通过运算符->
//访问资源
...
STD::auto _ ptr pi2(create investment());//让auto_ptr
//管理一个
//资源

bool taxable2 =!((*pi2)。istax free());//通过运算符*访问资源
//的权限

...

因为有时需要获取RAII对象内部的*资源,所以RAII类的一些设计者通过提供隐式转换函数来踩刹车。例如,考虑下面的RAII类,它为C++ API提供了原始字体资源:

font handle get font();//为了简单起见,省略了C API-params
//的

void release font(font handle FH);//来自同一个C API
class Font {//RAII class
public:
explicit Font(Font handle FH)//获取资源;
: f(fh) //使用按值传递,因为
{} // C API会这样做

~ Font(){ release Font(f);} //释放资源

private:
font handle f;//原始字体资源
};

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++箴言:在资源管理类中准备访问裸资源

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情