我眼裡的RuntimeClass實現 (轉)
最近開始學習VC了,談談心得吧。班門弄斧,請多多指教。
心得之一:
MFC中RuntiemClass支援的實現:
只要是從C派生的類,可以輕鬆實現RuntiemClass支援。當然,是透過提供的宏來實現的。那麼其實現機制是怎樣的呢?我覺得只需要四個步驟。
首先讓我們簡化一下CRuntiemClass和CObject的定義,抽取出與RuntiemClass相關的部分:
struct CRuntimeClass
{
char m_lpszClassName[255];
int m_nObjectSize;
CObject* (*m_pfnCreateObject)();
CObject* CreateObject();
};
class CObject
{
public:
virtual CRuntimeClass* GetRuntimeClass() const {return NULL;}
static CRuntimeClass clasbject;
virtual ~CObject(){};
protected:
CObject(){printf("CObject constructedn");}
};
我所說的四個步驟是(下面的操作都是對於從CObject派生的類而言的):
1.新增CRuntiemClass型別的靜態成員classCMyClass(請把CMyClass換成你的類名)
static CRuntimeClass classCMyClass;
2.覆蓋父類(即CObject)的GetRuntimeClass()方法,使之返回classCMyClass的指標
3.新增並實現 CreateObject();方法。
宣告: static CObject* CreateObject();
實現:CObject* CMyClass::CreateObject() { return new CMyClass; }
4.為classCMyClass賦值。使m_lpszClassName="CMyClass";
m_nObjectSize=sizeof (CMyClass);
指標m_pfnCreateObject指向CMyClass::CreateObject。
CRuntimeClass CMyClass::classCMyClass= {"CMyClass",sizeof (CMyClass),
CMyClass::CreateObject};
附上完整的例程(摘自Programming Visual C++6.0 Unleashed):
#include
#define RUNTIME_CLASS(class_name) (&class_name::class##class_name)
class CObject;
struct CRuntimeClass
{
char m_lpszClassName[21];
int m_nObjectSize;
CObject* (*m_pfnCreateObject)();
CObject* CreateObject();
};
class CObject
{
public:
virtual CRuntimeClass* GetRuntimeClass() const {return NULL;}
static CRuntimeClass classCObject;
virtual ~CObject(){};
protected:
CObject(){printf("CObject constructedn");}
};
CRuntimeClass CObject::classCObject=
{"CObject",sizeof(CObject),NULL};
CObject* CRuntimeClass::CreateObject()
{
return (*m_pfnCreateObject)();
}
class CAlpha:public CObject
{
public:
virtual CRuntimeClass* GetRuntimeClass() const
{
return &classCAlpha;
}
static CRuntimeClass classCAlpha;
static CObject* CreateObject();
protected:
CAlpha(){printf("CAlpha constructorn");}
};
CRuntimeClass CAlpha::classCAlpha={"CAlpha",sizeof(CAlpha),CAlpha::CreateObject};
CObject* CAlpha::CreateObject()
{
return new CAlpha;
}
class CBeta:public CObject
{
public:
virtual CRuntimeClass* GetRuntimeClass() const {return &classCBeta;}
static CRuntimeClass classCBeta;
static CObject* CreateObject();
protected:
CBeta(){printf("CBeta constructedn");}
};
CRuntimeClass CMyClass::classCMyClass= {"CMyClass",sizeof (CMyClass),
CMyClass::CreateObject};
CRuntimeClass CBeta::classCBeta={"CBeata",sizeof(CBeta),CBeta::CreateObject};
CObject* CBeta::CreateObject()
{
return new CBeta;
}
class CGama:public CObject
{
public:
virtual CRuntimeClass* GetRuntimeClass() const { return &classCGama;}
static CRuntimeClass classCGama;
static CObject* CreateObject();
protected:
CGama(){printf("CGama constructedn");}
};
CRuntimeClass CGama::classCGama={"CGama",sizeof(CGama),CGama::CreateObject};
CObject* CGama::CreateObject()
{
return new CGama();
}
int main()
{
printf("Entering dynCreate mainn");
CRuntimeClass* pRTCAlpha=RUNTIME_CLASS(CAlpha);
CObject* pObj1=pRTCAlpha->CreateObject();
printf("class of pObj1=%sn",pObj1->GetRuntimeClass()->m_lpszClassName);
CRuntimeClass* pRTCBeta=RUNTIME_CLASS(CBeta);
CObject* pObj2=pRTCBeta->CreateObject();
printf("class of pObj2=%sn",pObj2->GetRuntimeClass()->m_lpszClassName);
CRuntimeClass* pRTCGama=RUNTIME_CLASS(CGama);
CObject* pObj3=pRTCGama->CreateObject();
printf("class of pObj3=%sn",pObj3->GetRuntimeClass()->m_lpszClassName);
delete pObj1;
delete pObj2;
delete pObj3;
return 0;
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-996466/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 我的眼裡無軟體差別(轉)
- 在我眼裡的幾種語言
- 我眼裡的HTML5好書,截至目前出版HTML
- 我的CLog的實現 (轉)
- 一個新手司機眼裡的 VueVue
- 別人眼裡的程式設計師程式設計師
- 延時佇列我在專案裡是怎麼實現的?佇列
- 樹莓派:你是我的眼樹莓派
- canvas實現的千輪眼程式碼例項Canvas
- 我兒時的“清北夢”,竟然在這款遊戲裡實現了!遊戲
- 大話程式猿眼裡的高併發
- 測試眼裡的Hadoop系列 之TerasortHadoop
- 龍蜥開發者說:我眼裡的龍蜥社群:一個包容的大家庭 | 第 10 期
- 在ul裡面實現把多餘的文字轉化為“...”
- 瀏覽器之爭:程式設計師眼裡瀏覽器的地位 IE:我開了!瀏覽器程式設計師
- 瀏覽器之爭:程式設計師眼裡瀏覽器的地位IE:我開了!瀏覽器程式設計師
- 面試官讓我用 channel 實現 sync 包裡的同步鎖,是不是故意為難我?面試
- 基於Flutter實現的仿開眼視訊AppFlutterAPP
- 架構師眼裡的高併發架構架構
- 偶是一隻別人眼裡的程式猿
- 在ASP.NET裡輕鬆實現縮圖 (轉)ASP.NET
- 在C#裡實現DATAGRID的列印預覽和列印 (轉)C#
- C++ 實現Golang裡的deferC++Golang
- 一個Web設計師眼裡的雲端計算Web
- 記住我的實現方式
- 我是如何實現限流的?
- Fiori裡花瓣的動畫效果實現原理動畫
- 我對C++中THUNK一種實現技術的分析 (轉)C++
- 程式設計師IT行業,外行眼裡高收入人群,內行人裡的卷王程式設計師行業
- 知否?知否?情人眼裡出程式碼
- 十幾年前遊戲裡的一場“瘟疫”,讓如今的我們彷彿看到了現實遊戲
- 如何排查網路問題-開發眼裡的網路
- | / - 的旋轉效果實現(轉)
- 畢業前寫了20萬行程式碼,讓我從成為同學眼裡的麵霸!行程
- 《我們的約定會實現》
- 我該如何實現自己的理想
- 小程式實現微信 【我的】介面
- 我的一個PET STORE的實現