框架原理第三讲,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 操作符,返回指针或引用所指对象的实际类 ...
随机推荐
- 实验:ignite查询效率探究
前面的文章讲到ignite支持扫描查询和sql查询,其sql查询是ignite产品的一个亮点,那么哪一种的查询更适合我们的产品使用呢,往下看: 先分别贴一下扫描查询和sql查询两种查询方式的代码,供参 ...
- 《java.util.concurrent 包源码阅读》14 线程池系列之ScheduledThreadPoolExecutor 第一部分
ScheduledThreadPoolExecutor是ThreadPoolExecutor的子类,同时实现了ScheduledExecutorService接口. public class Sche ...
- Python 运行效率为何低
当我们提到一门编程语言的效率时:通常有两层意思,第一是开发效率,这是对程序员而言,完成编码所需要的时间:另一个是运行效率,这是对计算机而言,完成计算任务所需要的时间.编码效率和运行效率往往是鱼与熊掌的 ...
- kafka原理和实践(二)spring-kafka简单实践
系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...
- F - Capture
F - Capture 题链 题意 给你两种颜色的物品,有n组,每组有第一种颜色有w个,第二种为d个,每组必须选一种,求最后第一种颜色占的比值不低于K的最少需要选第一种的组数. 思路 首先没组都选第一 ...
- MySQL .msi 安装失败改用.zip安装步骤
一开始官网下载.msi安装包,安装到配置server时无法启动,长时间卡在这里,无法继续下去.上网看了一下解决办法,发现用.zip安装包进行安装比较简单可靠. 一.利用.msi安装包安装失败后的处理 ...
- strcmp函数
strcmp函数用于c语言中两个字符串比较(只可以比较字符串,不可以比较数字) 规则 当s1>s2时,返回为正数: 当s1=s2时,返回值为0: 当s1<s2时,返回为负数: 两个字符串自 ...
- 制作多级菜单hide()与show() toggle()
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 洛谷 P3928 Sequence
题目描述 小强喜欢数列.有一天,他心血来潮,写下了三个长度均为n的数列. 阿米巴也很喜欢数列.但是他只喜欢其中一种,波动数列. 阿米巴把他的喜好告诉了小强.小强便打算找出这三个数列内的最长波动数列. ...
- Sql Server 新的日期类型
新的日期类型:是出现在2008中的在2005中没有的日期类型. 1,Date 数据类型 2,time 数据类型 3, datetime2 数据类型 4, datetimeoffset 数据类型 ...