从学习使用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;
}