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

本文探讨了智能指针在资源管理类中的应用,重点介绍了如何通过显式和隐式转换来获取RAII对象内的资源。讨论了不同智能指针(如auto_ptr、shared_ptr)提供的访问方法,并通过实例展示了如何使用这些方法来访问和操作资源。此外,文章还阐述了在RAII对象内获取资源的一般接口设计,并分析了隐式转换可能带来的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

条款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 类都应该提供一个途径来获取它所管理的资源。
②访问可以通过显式转换或隐式转换来实现。一般情况下,显式转换更安全,但是隐式转换对于客户端程序员来说使用更方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值