MFC关键技术-动态创建
生活随笔
收集整理的這篇文章主要介紹了
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蓝桥杯 回文日期
- 下一篇: 【计算机网络复习】1.1.3 速率相关的