框架原理第三讲,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 操作符,返回指针或引用所指对象的实际类 ...
随机推荐
- ERP中文档权限设置:只能浏览不能下载?如何实现
文档中心的文件夹授权只能是对岗位或者用户授权(这个跟我们的[[url=]用户及权限[/url]]下面的授权方式还不太一样)比如:要将文档中心的文件夹[公司文档]授权给用户A和用户B 授权逻辑: 软件界 ...
- DES对称加密算法简析
1 对称加密算法 在了解DES算法前,先加单介绍一下对称加密算法,因为DES属于对称加密算法的一种. 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密 ...
- LayoutInflater 三种获得方式
LayoutInflater 作用是从外部加载一个xml布局文件. 获得 LayoutInflater 实例的三种方式: 1.LayoutInflater inflater = getLayoutIn ...
- 查看.ssh文件在哪
输入命令 ll -d ~/.ssh 后你就都明白了.
- laravel MethodNotAllowedHttpException错误一个原因
前两天在写api的时候,出现一个之前都没有碰到过的问题,如图 可以说提示信息是很不友好了,然后打开错误日志,发现报了一个MethodNotAllowedHttpException这样的错误,这样错误我 ...
- Function Programming - 纯函数(Pure Function)
纯函数的定义,非常重要!! Pure function 意指相同的输入,永远会得到相同的输出,而且没有任何显著的副作用. 老样子,我们还是从最简单的栗子开始: var minimum = 21; va ...
- HBase表预分区与压缩
1.建立HBase预分区表.sql语句如下: create 'buyer_calllogs_info_ts', 'record', {SPLITS_FILE => 'hbase_calllogs ...
- javascript权威指南pdf
链接:https://pan.baidu.com/s/1c19qfSk 密码:j4f3
- 项目实战6—Mysql实现企业级日志管理、备份与恢复实战
Mysql实现企业级日志管理.备份与恢复实战 环境背景:随着业务的发展,公司业务和规模不断扩大,网站积累了大量的用户信息和数据,对于一家互联网公司来说,用户和业务数据是根基.一旦公司的数据错乱或者丢失 ...
- php XSS安全过滤代码
function remove_xss($val) { // remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are ...