//a.h头文件
#pragma once
#include"m.h"
#include<iostream>
using namespace std;class CShape;//类声明//RTTI结构体
struct CRuntimeClassTest
{LPCSTR m_lpszClassName;int m_nObjectSize;UINT m_wSchema;CShape*(PASCAL*m_pfnCreateShape)();//PASCAL宏为 __stdcall,一种回调机制CRuntimeClassTest* m_pBaseClass;static CRuntimeClassTest*  pFirstClass;CRuntimeClassTest* m_pNextClass;CShape* CreateObject();static CRuntimeClassTest* PASCAL Load();
};//中间结构定义
struct CLASS_INIT_TEST
{CLASS_INIT_TEST(CRuntimeClassTest* pNewClass);//c++struct也有构造函数
};//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函数实现文件
#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结构体成员函数实现
CLASS_INIT_TEST::CLASS_INIT_TEST(CRuntimeClassTest * pNewClass)
{pNewClass->m_pNextClass = CRuntimeClassTest::pFirstClass;CRuntimeClassTest::pFirstClass = pNewClass;
}//Shape成员函数实现
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结构的函数实现
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"/*
下面为几组宏,由于文字代换
*宏定义,"\"指换行,后面的语句和它是一个部分的。
*其中##告诉编译器把左右连个字符串连接在一起,即把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_TEST 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)//关键技术三,动态创建对象需要定义的宏
#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测试类编写与测试
#pragma once
#include"a.h"
#include"m.h"
#include<iostream>
using namespace std;CRuntimeClassTest* CRuntimeClassTest::pFirstClass = NULL;//静态成员变量初始化的位置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 << "对象pE的类型为:CEllipse." << endl;}else{cout << "对象pE的类型不是CEllipse." << endl;}if (pC->IsKindOf(RUN_TIME_CLASS(CEllipse))){cout << "对象pC的类型为CEllipse." << endl;}else{cout << "对象pC的类型不是CEllipse." << endl;}if (pE->IsKindOf(RUN_TIME_CLASS(CCircle))){cout << "对象pE的类型为:CCircle." << endl;}else{cout << "对象pE的类型不是CCircle." << endl;}if (pC->IsKindOf(RUN_TIME_CLASS(CCircle))){cout << "对象pC的类型为CCircle." << endl;}else{cout << "对象pC的类型不是CCircle." << endl;}delete pE;delete pC;//测试动态创建类对象CRuntimeClassTest* pClassCreate;CShape* pShape;while (true){if ((pClassCreate = CRuntimeClassTest::Load())== NULL)break;pShape = pClassCreate->CreateObject();if (pShape != NULL)pShape->InputMsg();}    return 0;
}

运行结果如下,从运行结果可知,动态创建类对象成功。

MFC关键技术-动态创建相关推荐

  1. MFC中的动态创建与运行时识别

    MFC中支持运行时类型识别与动态创建.这更多的是设计问题.理解了其中的设计,可以更快定位用MFC框架开发的代码.通过研究MFC实现这些的细节,可以更快地掌握其他开发框架的设计思想. 宏定义中的&quo ...

  2. MFC关键技术-命令传递机制

  3. MFC关键技术-消息映射机制

  4. MFC关键技术-永久保存机制

    //Main.h文件 #pragma once #include<afxwin.h>class CEllipse :public CObject {DECLARE_SERIAL(CElli ...

  5. 深入浅出mfc学习笔记——六大关键技术之仿真_运行时和动态创建

    1:PS88:MFC的类层次结构 <1>CObject <2>CCmdTarget,CDocument <3>CCmdTarget_CWinThread_CWinA ...

  6. MFC六大核心机制之三:动态创建

    MFC中很多地方都使用了动态创建技术.动态创建就是在程序运行时创建指定类的对象.例如MFC的单文档程序中,文档模板类的对象就动态创建了框架窗口对象.文档对象和视图对象.动态创建技术对于希望了解MFC底 ...

  7. MFC六大关键技术之初始化过程

    MFC六大关键技术之初始化过程 我并不认为MFC减轻了程序员们的负担,MFC出现的目的虽然似乎是为了让程序员不用懂得太多就可以进行视窗编程,但本人在MFC里徘徊了很久很久(因为那时没有书本详细介绍MF ...

  8. 【转】 MFC六大关键技术

    MFC六大关键技术之初始化过程 我并不认为MFC减轻了程序员们的负担,MFC出现的目的虽然似乎是为了让程序员不用懂得太多就可以进行视窗编程,但本人在MFC里徘徊了很久很久(因为那时没有书本详细介绍MF ...

  9. 技术动态 | 「新一代知识图谱关键技术」最新2022进展综述

    转载公众号 | 专知 链接:https://crad.ict.ac.cn/CN/10.7544/issn1000-1239.20210829 近年来,国内外在新一代知识图谱的关键技术和理论方面取得了一 ...

最新文章

  1. 控件的实际大小与呈现大小
  2. Coding and Paper Letter(二十)
  3. Thrift在Windows及Linux平台下的安装和使用示例
  4. php sql 字段名称,PHPSQL Server – 字段名称被截断
  5. apache日志切割问题
  6. explorer.exe rundll32.exe病毒解决方案
  7. iOS开发网络篇—网络编程基础
  8. java和oracle的关联,Oracle数据关联查询
  9. git clone拉取指定分支
  10. c语言用二维数组学生姓名,C语言实验报告合集-_人人文库网
  11. excel单元格内容拆分_EXCEL批量拆分单元格,也可以这么快
  12. 慕课软件质量保证与测试(第九章.程序中隐藏错误数量估计)
  13. 关系型数据库及其SQL基础语句
  14. PIVOT 用法详解
  15. myeclipse web mysql_myEclipse,web项目连接数据库
  16. 华为5面,测试岗报价12k,面试官说我不尊重华为,他们没有那么低的薪资?
  17. 大脑和小脑——规划和执行
  18. 国密sm2 js加密后台解密,sm3 js、后台加密,sm4 后台加密
  19. 一台计算机英语美式发音,美式音标在线学习(Flash动画+真人发音口型)
  20. 游戏/应用出海本地化策略 | 韩国市场篇

热门文章

  1. LeetCode 683. K 个空花盆(set/滑动窗口)
  2. LeetCode 978. 最长湍流子数组(DP)
  3. LeetCode 1123. 最深叶节点的最近公共祖先(递归比较子树高度)
  4. python数组遍历输出所有组合_python遍历列表和数组实例讲解
  5. 线性代数不深入,机器学习两行泪!
  6. 拼写校正与动态规划的小故事
  7. 美团外卖客户端高可用建设体系
  8. 想成为阿里160万年薪的P8架构师?你必须掌握如下6大技能体系!
  9. 直通BAT必考题系列:JVM的4种垃圾回收算法、垃圾回收机制与总结
  10. Redis系列教程(五):Redis哨兵、复制、集群的设计原理,以及区别