框架原理第三讲,RTTCreate,运行时类型创建.(以MFC框架讲解)

通过昨天的讲解,我们已经理解了运行时类型识别是什么.

比如  CObject * pthis = (Cobject *)CreateObject("xxxx"); 这样通过字符串创建的方式是运行时类型创建.

只不过昨天为了讲解它的前半部分,举了一个简单的例子.

运行时类型识别,就是把我们的类名,和基类地址保存起来. 从一个链表中保存起来.

运行时类型创建就是把这个每个类的信息,在建立一张表来保存起来.

比如昨天我们写的

class CMyRuntimeClass
{
public:// AttributesLPCSTR m_lpszClassName;        //名字int m_nObjectSize;           //对象大小UINT m_wSchema;            //版本号CMyObject* (*m_pfnCreateObject)();  //创建对象的函数指针CMyRuntimeClass* m_pBaseClass;    //基类CMyRuntimeClass* m_pNextClass;    //下一个基类void *pInit;              //初始化数据
};

这个每个类都要初始化.且每个类初始化的时候,填写自己的类名.  创建对象的函数指针等等.

我们现在要做的就是把它在建立一张表保存起来.

1.创建链表,保存CRuntimeClass的信息

2.每次都要进行初始化,所以建立一个类专门进行初始化

置于为什么要新建立一个类进行初始化

是这样的.

我们用户建立的类,需要加入到这个链表中保存起来,但是要怎么保存?

1.构造中加入链表?

  不行,这样每次new 对象就加一次很麻烦

2.全局变量加链表,保证每次加入一个.

  可以,但是会遇到作用域的问题.

class CMyClassInit
{
public:CMyClassInit(CMyRuntimeClass* pRuntimeClass){g_RuntimeList.push_back(pRuntimeClass);      //每次运行,加入到链表中.}~CMyClassInit(){}
};

只需要变为静态的成员,既可加入到链表中.

因为静态成员太多,所以封装为了宏.

声明宏

所以支持动态创建的实现宏

只需要用户自己的类(除了theapp),以及所有支持动态创建的类(凡是继承CWND的类都要支持动态创建)

加上声明宏和实现宏既可.

使用RTTI动态创建.

1.提供根据名称创建对象的函数(在WMain)

CMyObject *CreateMyObj(const char *pClsName)
{//遍历for (MyIterator it = g_RuntimeList.begin();it != g_RuntimeList.end();it++){CMyRuntimeClass *pRuntimeClass = *it;if (strcmp(pRuntimeClass->m_lpszClassName, pClsName) == 0){if (pRuntimeClass->m_pfnCreateObject != NULL)return pRuntimeClass->m_pfnCreateObject();}}return NULL;
}

其内部就是遍历我们的链表信息,取得每一个类的CreateObj.

2.调用动态创建.

置于用户的类,在一开始生成类向导的时候才进行填写.

转载于:https://www.cnblogs.com/iBinary/p/8077419.html

框架原理第三讲,RTTCreate,运行时类型创建.(以MFC框架讲解)相关推荐

  1. 框架原理第一讲,熟悉常用的设计方式.(以MFC框架讲解)

    框架原理第一讲,熟悉常用的设计方式.(以MFC框架讲解) 一丶什么是框架,以及框架的作用 什么是框架? 框架,简而言之就是把东西封装好了,使用框架开发可以快速开发程序,例如MFC程序的双击写代码. 为 ...

  2. java 运行时类型_Java基础之RTTI 运行时类型识别

    运行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息. 多态(polymorphism)是基于R ...

  3. SAP UI5 应用开发教程之五十八 - 使用工厂方法在运行时动态创建不同类型的列表行项目控件试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  4. c++ RTTI(运行时类型识别)

    通过RTTI,能够通过基类的指针或引用来检索其所指对象的实际类型.c++通过下面两个操作符提供RTTI. (1)typeid:返回指针或引用所指对象的实际类型. (2)dynamic_cast:将基类 ...

  5. wxWidgets:运行时类型信息 (RTTI)

    wxWidgets:运行时类型信息 (RTTI) wxWidgets:运行时类型信息 (RTTI) 类信息 RTTI例子 wxWidgets:运行时类型信息 (RTTI) C++ 的一个缺点曾经是没有 ...

  6. new,is和as运算符解析及运行时类型,对象,线程堆栈,托管堆之间的联系

    CLR要求对象必须使用new运算符创建,在使用new运算符创建一个对象时具体都做了些什么呢? 1.计算所有定义的实例字段,所有的基类型包括System.Object需要分配的字节数. 每一个堆上的对象 ...

  7. MFC六大核心机制之二:运行时类型识别(RTTI)

    上一节讲的是MFC六大核心机制之一:MFC程序的初始化,本节继续讲解MFC六大核心机制之二:运行时类型识别(RTTI). typeid运算子 运行时类型识别(RTTI)即是程序执行过程中知道某个对象属 ...

  8. C++ 学习笔记之(19) new、delete表达式、RTTI(运行时类型识别)、枚举、类成员指针、嵌套类、局部类、位域、volatile、extern C

    C++ 学习笔记之(19) new.delete表达式.RTTI(运行时类型识别).枚举.类成员指针.嵌套类.局部类.位域.volatile.extern C C++ 学习笔记之(19) new.de ...

  9. java rtti_举例讲解Java的RTTI运行时类型识别机制

    1.RTTI:运行时类型信息可以让你在程序运行时发现和使用类型信息. 在Java中运行时识别对象和类的信息有两种方式:传统的RTTI,以及反射.下面就来说下RTTI. RTTI:在运行时,识别一个对象 ...

最新文章

  1. SAP MM MB21创建预留单据时候M标记能否自动勾选?
  2. python3在线手册_Python 3 手册
  3. 「mysql优化专题」90%程序员都会忽略的增删改优化(2)
  4. 天题系列: Candy
  5. opengl加载显示3D模型ZAE类型文件
  6. elasticsearch scroll 一页最大数据量_elasticsearch 百亿级数据检索案例与原理
  7. 红旗linux6.0安装不了,在红旗linux6.0中安装vmware tools遇到的问题
  8. 如何在树莓派上安装Fedora 25
  9. 外部库依赖以及 编译
  10. C# 类中索引器的使用
  11. 手机远程服务器总说磁盘空间不足,查询远程服务器上磁盘空间的最佳方式
  12. conda:Could not find a version that satisfies the requirement XXX
  13. sqlyog设置自动补全_SQLYog快捷键大全
  14. 网页设计之 HTML代码的理解.
  15. 计算机硬件故障有哪些现象,计算机常见硬件故障症状现象分析及解决办法
  16. Python破解WIFI密码详细介绍
  17. 【Unity3D日常开发】Unity3D中实现向Web服务器上传图片以及下载图片功能
  18. 互联网公司加班狠?盘点阿里、华为的凌晨四点
  19. 【task09】集合运算---内连结
  20. 电脑加载,电脑加载慢又卡怎么办

热门文章

  1. FFMPEG源码分析:avformat_open_input()(媒体打开函数)
  2. oracle联机文档使用,Sqlplus 联机文档学习
  3. python 在线编程 实现_Python进阶开发之网络编程,socket实现在线聊天机器人
  4. 电大计算机应用基础考试题6,2016电大计算机应用基础考试题及答案.doc
  5. Kubernetes 使用 Ingress-nginx 实现灰度发布功能
  6. ElementUI下拉框选择后不显示值
  7. C++ 点(.)操作符和箭头(->)操作符
  8. 【CCCC】L3-019 代码排版 (30分),大模拟
  9. 【NOIP2010】【Luogu1540】机器翻译
  10. mysql 创建索引 key_Mysql中创建索引的INDEX和KEY