C++编译器解析operator->机制及自锁定技术实现

128 篇文章 0 订阅
65 篇文章 0 订阅

机制说明

编译器可以对一个->表达式多次应用operator->,直到找到原始指针。

例子

好用的RAII手法

template<typename T>
struct LockingProxy
{
	LockingProxy(T* pObj) : pointee_ (pObj )
	{
		pointee_->lock(); 
	}

	~LockingProxy()
	{ 
		pointee_->unlock(); 
	}
	
	T* operator->() const
	{ 
		return pointee_;
	}
	
	LockingProxy& operator=(const LockingProxy&) = delete;
	
private:
	T* pointee _;
};

另一个类的实现:

template<typename T>
class SmartPtr
{
	// ...
	LockingProxy<T> operator->() const
	{ 
		return LockingProxy<T>(pointee_); 
	}
private:
	T* pointee_;
};

可以看出以上两个类都实现了operator->。
使用:

SmartPtr<Widget> sp = new Widgetl
sp->doSomething();

技巧说明:
SmartPtr的operator->传回一个LockingProxy<T>临时对象。编译器继续施行operator->,LockingProxy的operator->传回Widget*。编译器通过这个sp指针调用doSomething ()。调用期间,LockingProxy<T>临时对象处于活跃状态并锁定Widget对象;即对象被安全锁定了。一旦 doSomething()返问,LockingProxy<T>临时对象被摧毁,Widget对象也随之解锁(RAII)。

总结

上面实现是一种自动锁定技术。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值