從學習使用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;
}
python operator,
static CNoTrackObject* CreateObject()
后來發現上面的代碼有點冗余,下面貼上一個簡單、精煉點兒的
operator變形。
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;
}
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态