您的位置:首页 > 其它

条款15:在资源管理类中提供对原始资源的访问

2014-05-29 09:33 501 查看
条款15:在资源管理类中提供对原始资源的访问
所有的智能指针都提供一个访问原始资源的方法,包括: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 类都应该提供一个途径来获取它所管理的资源。

②访问可以通过显式转换或隐式转换来实现。一般情况下,显式转换更安全,但是隐式转换对于客户端程序员来说使用更方便。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐