条款15:在资源管理类中提供对原始资源的访问
2014-05-29 09:33
501 查看
条款15:在资源管理类中提供对原始资源的访问
所有的智能指针都提供一个访问原始资源的方法,包括:auto_ptr、shared_ptr、boost库提供的几种智能指针。
看之前的代码
shared_ptr和auto_ptr都提供get()成员函数显示获取资源指针,而且也重载了->和*符号,用来隐式转换指针
如何去获取RAII对象内的资源?这需要自己去定义接口
显示类型转换接口,get
记住
①API 通常需要访问原始资源,因此每个 RAII 类都应该提供一个途径来获取它所管理的资源。
②访问可以通过显式转换或隐式转换来实现。一般情况下,显式转换更安全,但是隐式转换对于客户端程序员来说使用更方便。
所有的智能指针都提供一个访问原始资源的方法,包括:auto_ptr、shared_ptr、boost库提供的几种智能指针。
看之前的代码
class MyLock { public: explicit MyLock(Mutex *mutex) :m_mutexPtr(mutex, unlock) { lock(m_mutexPtr.get()); //lock函数需要Mutex的地址,可通过shared_ptr提供的显示类型转换函数get() } //~MyLock() {unlock(m_mutex);} private: std::tr1::shared_ptr<Mutex> m_mutexPtr; };
shared_ptr和auto_ptr都提供get()成员函数显示获取资源指针,而且也重载了->和*符号,用来隐式转换指针
class Product { public: enum {CPU, KEY}; void SellProduct() {} };使用隐式类型转换调用
std::tr1::shared_ptr<Product> ptr(GetProduct(1)); ptr->SellProduct(); //重载->获得底层指针 (*ptr).SellProduct(); //重载*获得底层对象</span>RAII对象内的资源
如何去获取RAII对象内的资源?这需要自己去定义接口
显示类型转换接口,get
class FontHandls {}; void releaseFont(FontHandls * fh) {} class Font { public: explicit Font(FontHandls *fh) : m_fontHandls(fh) {} ~Font() {releaseFont(m_fontHandls);} FontHandls *get() const {return m_fontHandls;} private: FontHandls *m_fontHandls; };隐式转换接口,实现对应的重载操作符
class FontHandls {}; typedef FontHandls* FontPtr; void releaseFont(FontHandls * fh) {} class Font { public: explicit Font(FontHandls *fh) : m_fontHandls(fh) {} ~Font() {releaseFont(m_fontHandls);} //FontHandls *get() const {return m_fontHandls;} operator FontPtr (){return m_fontHandls;} //重载自定义类型,隐式转换成内部指针 FontHandls *operator ->() const{ return m_fontHandls;} //隐式转换 FontHandls operator *() const {return *m_fontHandls;} //隐式转换 private: FontHandls *m_fontHandls; }; void OperateFont(FontHandls *fh) {};调用
FontHandls *fh; Font f(fh); OperateFont(f);对应RAII对象资源隐式转换可能会出现的隐藏问题
FontHandls *fh; Font f(fh); FontHandls *fh2 = f; //愿意是想拷贝Font对象,内部实际是转换为FontHandls*返回</span>
记住
①API 通常需要访问原始资源,因此每个 RAII 类都应该提供一个途径来获取它所管理的资源。
②访问可以通过显式转换或隐式转换来实现。一般情况下,显式转换更安全,但是隐式转换对于客户端程序员来说使用更方便。
相关文章推荐
- 条款15 在资源管理类中提供对原始资源的访问
- Effective C++:条款15:在资源管理类提供对原始资源的访问
- 条款15: 在资源管理类中提供对原始资源的访问
- effective c++ 条款15 在资源管理类中提供对原始资源的访问
- 条款15:在资源管理类中提供对原始资源的访问
- Effective C++ 条款15:在资源管理类中提供对原始资源的访问
- 条款15:在资源管理类中提供对原始资源的访问
- 条款15、在资源管理类中提供对原始资源的访问
- 【Effective c++】条款15:在资源管理类中提供对原始资源的访问
- Effective C++ 条款15 在资源管理类中提供对资源的原始访问
- Effective C++ -----条款15:在资源管理类中提供对原始资源的访问
- 读书笔记《Effective c++》 条款15 在资源管理类中提供对原始资源的访问
- 条款15 在资源管理类中提供对原始资源的访问
- 读书笔记《Effective C++》条款15:在资源管理类中提供对原始资源的访问
- 《Effective C++》学习笔记条款15 在资源管理类中提供对原始资源的访问
- effective C++ 条款 15:在资源管理类中提供对原始资源的访问
- 条款15:在资源管理类中提供对原始资源的访问
- 条款15:在资源管理类中提供对原始资源的访问(Provide access to raw resources in resource-managing classes)
- Effective C++ 条款15、16 在资源管理类中提供对原始资源的访问||成对使用new 与 delete要采取相同形式
- Effective C++——》条款15:在资源类管理类中提供对原始资源的访问