框架原理第三讲,RTTCreate,运行时类型创建.(以MFC框架讲解)
框架原理第三讲,RTTCreate,运行时类型创建.(以MFC框架讲解)
通过昨天的讲解,我们已经理解了运行时类型识别是什么.
比如 CObject * pthis = (Cobject *)CreateObject("xxxx"); 这样通过字符串创建的方式是运行时类型创建.
只不过昨天为了讲解它的前半部分,举了一个简单的例子.
运行时类型识别,就是把我们的类名,和基类地址保存起来. 从一个链表中保存起来.
运行时类型创建就是把这个每个类的信息,在建立一张表来保存起来.
比如昨天我们写的
class CMyRuntimeClass
{
public:
// Attributes
LPCSTR 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) == )
{
if (pRuntimeClass->m_pfnCreateObject != NULL)
return pRuntimeClass->m_pfnCreateObject();
}
} return NULL;
}
其内部就是遍历我们的链表信息,取得每一个类的CreateObj.
2.调用动态创建.

置于用户的类,在一开始生成类向导的时候才进行填写.
框架原理第三讲,RTTCreate,运行时类型创建.(以MFC框架讲解)的更多相关文章
- 框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解)
框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解) 一丶什么是RTTI,以及RTTI怎么设计 通过第一讲,我们知道了怎么样升成一个窗口了,以及简单的消息循环. 第二讲则是主要讲解RTTI ...
- MFC原理第三讲.RTTI运行时类型识别
MFC原理第三讲.RTTI运行时类型识别 一丶什么是RTTI RTTI. 运行时的时候类型的识别. 运行时类型信息程序.能够使用基类(父类)指针 或者引用 来检查这些指针或者引用所指的对象. 实际派生 ...
- 框架原理第一讲,熟悉常用的设计方式.(以MFC框架讲解)
框架原理第一讲,熟悉常用的设计方式.(以MFC框架讲解) 一丶什么是框架,以及框架的作用 什么是框架? 框架,简而言之就是把东西封装好了,使用框架开发可以快速开发程序,例如MFC程序的双击写代码. 为 ...
- RTTI (Run-Time Type Identification,通过运行时类型识别) 转
参考一: RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型. RTTI提供了以下两个 ...
- MFC六大核心机制之二:运行时类型识别(RTTI)
上一节讲的是MFC六大核心机制之一:MFC程序的初始化,本节继续讲解MFC六大核心机制之二:运行时类型识别(RTTI). typeid运算子 运行时类型识别(RTTI)即是程序执行过程中知道某个对象属 ...
- Java基础之RTTI 运行时类型识别
运行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息. 多态(polymorphism)是基于R ...
- Java进阶(四)Java反射TypeToken解决泛型运行时类型擦除问题
在开发时,遇到了下面这条语句,不懂,然习之. private List<MyZhuiHaoDetailModel> listLottery = new ArrayList<MyZhu ...
- 【JavaSE】运行时类型信息(RTTI、反射)
运行时类型信息使得你可以在程序运行时发现和使用类型信息.--<Think in java 4th> **** 通常我们在面向对象的程序设计中我们经常使用多态特性使得大部分代码尽可能地少了解 ...
- C++运行时类型识别
通过运行时类型识别(RTTI),程序能够使用基类的指针或引用来检索这些指针或引用所指对象的实际派生类型. 通过下面两个操作符提供 RTTI: 1. typeid 操作符,返回指针或引用所指对象的实际类 ...
随机推荐
- JavaScript学习笔记(十一)——闭包
在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...
- NETStandard,NETFx,Mono,NETCore,ASPNetCore 之间关系的整理
因为现在很多人对这几者之间的关系还不甚了解,这里根据我所知来做一个大概的介绍...... .NET Standard: .NET标准,只要符合这个标准实现类库,即可在支持此标准的Run ...
- iOS 中 .a 和 .framework 静态库的创建与 .bundle 资源包的使用
iOS 中 .a 和 .framework 静态库的创建与 .bundle 资源包的使用 前言 开发中经常使用三方库去实现某特定功能,而这些三方库通常又分为开源库和闭源库.开源库可以直接拿到源码,和自 ...
- 【javaFX学习】(二) 控件手册
这里写的控件可能不是所有的控件,但是应该是比较齐全并足够用的了,后面还有图表类的,3d模型类,放在后面来写吧,太多了.javafx的功能比以前想象中的要强大.而且也很方便,所有的控件写完后再用Scen ...
- 禁止mui事件tab切换内容左右滑动
mui('.mui-slider').slider().setStopped(true);
- Relax信息学题库须知
Relax信息学题库须知 1.本题库于2017.10.15开始建设(建设中),私聊我便可成为题库管理员,关注我即可成为题库成员.我的QQ:2026503022,微信:dy060207. 2.本题库的建 ...
- 学校的c++程序课程设计(简单的写法 并无太多c++的特色)
好久没更新博客了,最近一直在忙,花了一天时间做出这个简陋版的课程设计, 为了储存,也为了更新,所以于今天更新我的博客. 我选的课程设计题目如下: 某某公司的设备管理系统 功能及要求描述: (1)公司主 ...
- python 3.6 +pyMysql 操作mysql数据库
版本信息:python:3.6 mysql:5.7 pyMysql:0.7.11 ########################################################### ...
- python 爬取国家粮食局东北地区玉米收购价格监测信息
#!/usr/bin/python# -*- coding: UTF-8 -*-import reimport sysimport timeimport urllibimport urllib.req ...
- WINDOWS java 不能正常卸载 问题, (其他系统问题 也可以试试)
1.JAVA 原安装包无法卸载 不知道 有没有通知 碰到过这种情况的 自己碰到过3次这种情况了, 卸载不掉, 在网上 找了N多中 方法, 注册表什么的都被翻烂了, 单还是没用,其中有一次还把 ...