日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MFC关键技术-动态创建

發(fā)布時(shí)間:2024/7/19 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MFC关键技术-动态创建 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

//a.h頭文件 #pragma once #include"m.h" #include<iostream> using namespace std;class CShape;//類聲明//RTTI結(jié)構(gòu)體 struct CRuntimeClassTest {LPCSTR m_lpszClassName;int m_nObjectSize;UINT m_wSchema;CShape*(PASCAL*m_pfnCreateShape)();//PASCAL宏為 __stdcall,一種回調(diào)機(jī)制CRuntimeClassTest* m_pBaseClass;static CRuntimeClassTest* pFirstClass;CRuntimeClassTest* m_pNextClass;CShape* CreateObject();static CRuntimeClassTest* PASCAL Load(); };//中間結(jié)構(gòu)定義 struct CLASS_INIT_TEST {CLASS_INIT_TEST(CRuntimeClassTest* pNewClass);//c++struct也有構(gòu)造函數(shù) };//CShape基類定義 class CShape { public:virtual CRuntimeClassTest* GetRuntimeClassTest() const;BOOL IsKindOf(const CRuntimeClassTest* pClass) const;virtual void InputMsg() { cout << "CShape Successfully Created!" << endl; } public:static CRuntimeClassTest classCShape; }; //a.cpp函數(shù)實(shí)現(xiàn)文件 #include "a.h" #include"m.h" #include<iostream> using namespace std;//全局變量 static char szCShape[] = "CShape"; struct CRuntimeClassTest CShape::classCShape = { szCShape ,sizeof(szCShape),0xffff,NULL,NULL }; static CLASS_INIT_TEST init_CShape(&CShape::classCShape);//CLASS_INIT_TEST結(jié)構(gòu)體成員函數(shù)實(shí)現(xiàn) CLASS_INIT_TEST::CLASS_INIT_TEST(CRuntimeClassTest * pNewClass) {pNewClass->m_pNextClass = CRuntimeClassTest::pFirstClass;CRuntimeClassTest::pFirstClass = pNewClass; }//Shape成員函數(shù)實(shí)現(xiàn) CRuntimeClassTest* CShape::GetRuntimeClassTest() const {return &CShape::classCShape; }BOOL CShape::IsKindOf(const CRuntimeClassTest * pClass) const {CRuntimeClassTest* pClassThis = GetRuntimeClassTest();while (pClassThis != NULL){if (pClassThis == pClass)return TRUE;pClassThis = pClassThis->m_pBaseClass;}return FALSE; }//CRuntimeClassTest結(jié)構(gòu)的函數(shù)實(shí)現(xiàn) CShape * CRuntimeClassTest::CreateObject() {if (m_pfnCreateShape == NULL){cout << "Error:Trying to creat object which is not DYNAMIC_CREATE_OBJECT:" << m_lpszClassName << endl;;return NULL;}CShape* pS = NULL;pS = (*m_pfnCreateShape)();return pS; } CRuntimeClassTest * CRuntimeClassTest::Load() {char szClassName[64];CRuntimeClassTest* pClass;cout << "Input a class name:";cin >> szClassName;for (pClass = pFirstClass; pClass != NULL; pClass = pClass->m_pNextClass){if (strcmp(szClassName, pClass->m_lpszClassName) == 0)//strcmp比較兩字符串是否相等return pClass;}cout << "class not found:" << szClassName << endl;return NULL; } //m.h宏定義文件 #pragma once #include<afxwin.h> #include"a.h"/* 下面為幾組宏,由于文字代換 *宏定義,"\"指換行,后面的語句和它是一個(gè)部分的。 *其中##告訴編譯器把左右連個(gè)字符串連接在一起,即把class和參數(shù)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_TEST init_##class_name(&class_name::class_name::class##class_name);\CRuntimeClassTest* class_name::GetRuntimeClassTest() const\{return &class_name::class##class_name;}/* *用于動(dòng)態(tài)創(chuàng)建對(duì)象的宏 */ #define DYNAMIC_CREATE(class_name,baseclass_name)\DYNAMIC_RUNTIMECLASS(class_name,baseclass_name,0xFFFF,NULL)//關(guān)鍵技術(shù)三,動(dòng)態(tài)創(chuàng)建對(duì)象需要定義的宏 #define DYNAMIC_CREATE_OBJECT(class_name)\TyPeName(class_name)\static CShape*PASCAL CreateObject();#define IMP_DYN_CREATE(class_name,baseclass_name)\CShape*PASCAL class_name::CreateObject(){return new class_name;}\DYNAMIC_RUNTIMECLASS(class_name,baseclass_name,0xffff,class_name::CreateObject) //main.cpp測(cè)試類編寫與測(cè)試 #pragma once #include"a.h" #include"m.h" #include<iostream> using namespace std;CRuntimeClassTest* CRuntimeClassTest::pFirstClass = NULL;//靜態(tài)成員變量初始化的位置class CEllipse :public CShape {//TyPeName(CEllipse)DYNAMIC_CREATE_OBJECT(CEllipse)public:CEllipse() { cout << "CEllipse Successfully Constructor!" << endl; }void InputMsg() { cout << "CEllipse Successfully Created!" << endl; } }; class CCircle :public CEllipse { //TyPeName(CCircle)DYNAMIC_CREATE_OBJECT(CCircle) public:CCircle() { cout << "CCircle Successfully Constructor!"<< endl; }void InputMsg() { cout << "CCircle Successfully Created!" << endl; } };//DYNAMIC_CREATE(CEllipse,CShape) //DYNAMIC_CREATE(CCircle, CEllipse)IMP_DYN_CREATE(CEllipse, CShape) IMP_DYN_CREATE(CCircle, CEllipse) 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 << "對(duì)象pE的類型為:CEllipse." << endl;}else{cout << "對(duì)象pE的類型不是CEllipse." << endl;}if (pC->IsKindOf(RUN_TIME_CLASS(CEllipse))){cout << "對(duì)象pC的類型為CEllipse." << endl;}else{cout << "對(duì)象pC的類型不是CEllipse." << endl;}if (pE->IsKindOf(RUN_TIME_CLASS(CCircle))){cout << "對(duì)象pE的類型為:CCircle." << endl;}else{cout << "對(duì)象pE的類型不是CCircle." << endl;}if (pC->IsKindOf(RUN_TIME_CLASS(CCircle))){cout << "對(duì)象pC的類型為CCircle." << endl;}else{cout << "對(duì)象pC的類型不是CCircle." << endl;}delete pE;delete pC;//測(cè)試動(dòng)態(tài)創(chuàng)建類對(duì)象CRuntimeClassTest* pClassCreate;CShape* pShape;while (true){if ((pClassCreate = CRuntimeClassTest::Load())== NULL)break;pShape = pClassCreate->CreateObject();if (pShape != NULL)pShape->InputMsg();} return 0; }

運(yùn)行結(jié)果如下,從運(yùn)行結(jié)果可知,動(dòng)態(tài)創(chuàng)建類對(duì)象成功。

總結(jié)

以上是生活随笔為你收集整理的MFC关键技术-动态创建的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。