MFC的六大关键技术
生活随笔
收集整理的這篇文章主要介紹了
MFC的六大关键技术
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
//main.h頭文件 #pragma once #include"a.h" class CShape { public:virtual CRuntimeClassTest* GetRuntimeClassTest() const;BOOL IsKindOf(const CRuntimeClassTest* pClass) const; public:static CRuntimeClassTest classCShape; };static char szCShape[] = "CShape"; struct CRuntimeClassTest CShape::classCShape = { szCShape ,sizeof(szCShape),0xffff,NULL,NULL}; static CLASS_INIT init_CShape(&CShape::classCShape);CRuntimeClassTest* CShape::GetRuntimeClassTest() const {return &CShape::classCShape; }inline BOOL CShape::IsKindOf(const CRuntimeClassTest * pClass) const {CRuntimeClassTest* pClassThis = GetRuntimeClassTest();while (pClassThis!= NULL){if (pClassThis == pClass)return TRUE;pClassThis = pClassThis->m_pBaseClass;}return FALSE; } //a.h頭文件 #pragma once #include<afxwin.h> class CShape; //RTTI結構體 struct CRuntimeClassTest {LPCSTR m_lpszClassName;int m_nObjectSize;UINT m_wSchema;CShape*(PASCAL*m_pfnCreateShape)();CRuntimeClassTest* m_pBaseClass;static CRuntimeClassTest* pFirstClass;CRuntimeClassTest* m_pNextClass; };struct CLASS_INIT {//c++struct也有構造函數CLASS_INIT(CRuntimeClassTest* pNewClass); };//下面為幾組宏,由于文字代換 /* *宏定義,"\"指換行,后面的語句和它是一個部分的。 *其中##告訴編譯器把左右連個字符串連接在一起,即把class和參數class_name的值連接在一起。 */ #define TyPeName(class_name)\public:\static CRuntimeClassTest class##class_name;\virtual CRuntimeClassTest* GetRuntimeClassTest() const;#define RUN_TIME_CLASS(class_name)\(&class_name::class##class_name)#define DYNAMIC_RUNTIMECLASS(class_name,baseclass_name,wSchema,pfnNew)\static char lpsz##class_name[]=#class_name;\CRuntimeClassTest class_name::class##class_name={\lpsz##class_name,sizeof(class_name),wSchema,pfnNew,RUN_TIME_CLASS(baseclass_name),NULL};\static CLASS_INIT init_##class_name(&class_name::class_name::class##class_name);\CRuntimeClassTest* class_name::GetRuntimeClassTest() const\{return &class_name::class##class_name;}/* *用于動態創建對象的宏 */ #define DYNAMIC_CREATE(class_name,baseclass_name)\DYNAMIC_RUNTIMECLASS(class_name,baseclass_name,0xFFFF,NULL)CLASS_INIT::CLASS_INIT(CRuntimeClassTest * pNewClass) {pNewClass->m_pNextClass = CRuntimeClassTest::pFirstClass;CRuntimeClassTest::pFirstClass = pNewClass; } //main.cpp #pragma once #include"a.h" #include"main.h" #include<iostream> using namespace std;CRuntimeClassTest* CRuntimeClassTest::pFirstClass = NULL;//靜態成員變量初始化的位置class CCircle :public CShape {TyPeName(CCircle)}; class CEllipse :public CCircle {TyPeName(CEllipse) };DYNAMIC_CREATE(CCircle,CShape) DYNAMIC_CREATE(CEllipse,CCircle)void Print() {CRuntimeClassTest* pClass;for (pClass = CRuntimeClassTest::pFirstClass; pClass != NULL; pClass = pClass->m_pNextClass){cout << pClass->m_lpszClassName << "," << pClass->m_nObjectSize << "," << pClass->m_wSchema << endl;} } int main() {CEllipse* pE = new CEllipse;CCircle* pC = new CCircle;Print();if (pE->IsKindOf(RUN_TIME_CLASS(CEllipse))){cout << "對象pE的類型為:CEllipse" << endl;}if (pC->IsKindOf(RUN_TIME_CLASS(CShape))){cout << "對象pC的類型為CShape" << endl;}delete pE;delete pC;return 0; }?若代碼改為如下圖,則運行結果如下:
if (pE->IsKindOf(RUN_TIME_CLASS(CEllipse))){cout << "對象pE的類型為:CEllipse" << endl;}if (pC->IsKindOf(RUN_TIME_CLASS(CEllipse))){cout << "對象pC的類型為CShape" << endl;}總結
以上是生活随笔為你收集整理的MFC的六大关键技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机网络(十九)-IEEE802.11
- 下一篇: 【操作系统复习】操作系统的特征