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