operator* operator-> 操作符的使用

来源:互联网 发布:三维教学动画软件 编辑:程序博客网 时间:2024/06/05 09:11

从学习使用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
原创粉丝点击