operator* operator-> 操作符的使用

从学习使用C、C++以来,对于操作符的重载的问题一直就是不理解,究其根源编译器是怎么处理这些事情的呢?下面重现以下场

//
//
class CNoTrackObject
{
};

class CThreadLocalObject
{
public:
	CNoTrackObject* GetData(CNoTrackObject* (*pfnCreateObject)())
	{
		CNoTrackObject* pValue = (*pfnCreateObject)();		
		return pValue;
	}
	~CThreadLocalObject(){}
};

template<class TYPE>
class CThreadLocal : public CThreadLocalObject
{
public:
	TYPE* GetData()
	{
		TYPE* pData = (TYPE*)CThreadLocalObject::GetData(&CreateObject);
		return pData;
	}
	operator TYPE*()
	{
		return GetData();
	}
	TYPE* operator->()
	{
		return GetData();
	}
public:
	static CNoTrackObject* CreateObject()
	{ 
		return new TYPE;
	}
};

#define THREAD_LOCAL(class_name, ident_name) CThreadLocal<class_name> ident_name;

//
// // // // // // //  上面的代码是框架,下面的代码是使用  // // // // // // // // // // // // // // // // // // 
//


struct CMyThreadData : public CNoTrackObject
{
	int nSomeData;
};
THREAD_LOCAL(CMyThreadData, g_myThreadData)

void main()
{
	CMyThreadData *p=g_myThreadData;
}


只需要给以下代码加上断点,进行调试即可,通过堆栈查看其调用过程即可
static CNoTrackObject* CreateObject()



后来发现上面的代码有点冗余,下面贴上一个简单、精炼点儿的

class Base
{
public:
	Base* GetData(Base* (*pfnCreateObject)())
	{
		Base* pData = (*pfnCreateObject)();
		return pData;
	}
	operator Base*()
	{
		return GetData(&CreateObject);
	}
	Base* operator->()
	{
		return GetData(&CreateObject);
	}
public:
	static Base* CreateObject()
	{ 
		return new Base;
	}
};

Base g_Base;

void main()
{
	Base *q=g_Base;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值