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()); ......
// 类设定 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指向的资源也同时被释放。
Effective C++(15) 在资源管理类中提供对原始资源的访问
原文:http://blog.csdn.net/zs634134578/article/details/18896883