Item 15 访问资源管理类内的资源

class Investment { public: bool isTaxFree() const; ... }; // return number of days investment has been held // 需要Investment作为参数 int daysHeld(const Investment *pi); // 工厂函数 Investment* createInvestment(); // 使用shared_ptr管理Investment类的对象 std::tr1::shared_ptr<Investment> pInv( createInvestment() ); int days = daysHeld( pInv.get() ); // passes the raw pointer in pInv to daysHeld // 使用->操作符 std::tr1::shared_ptr<Investment> pi1(createInvestment()); bool taxable1 = !(pi1->isTaxFree()); // 使用点操作符 std::auto_ptr<Investment> pi2(createInvestment()); bool taxable2 = !((*pi2).isTaxFree());

 

添加一个隐式转换,使用时会更方便:

 

// 假设有两个C的API,都要使用FontHandle来访问系统的字体资源 FontHandle getFont(); void releaseFont(FontHandle fh); // 定义一个RAII来管理FontHandle class Font { public: // acquire resource; explicit Font(FontHandle fh) : f(fh) {} // release resource ~Font() { releaseFont(f);} // 显式类型转换 FontHandle get() const { return f;} // 隐式类型转换,有了它,就不必用上面的get // 缺点是,会增加犯错误的风险 operator FontHandle() const { return f;} private: FontHandle f; // the raw font resource }; Font f(getFont()); // changeFontSize(f.get(), newFontSize); // explicitly convert Font to FontHandle changeFontSize(f, newFontSize); // implicitly convert Font to FontHandle Font f1(getFont()); FontHandle f2 = f1; // f1和f2共同指向了一个字体,以后f2可能会成为空悬句柄

你可能感兴趣的:(Item 15 访问资源管理类内的资源)