框架原理第三讲,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框架讲解)的更多相关文章

  1. 框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解)

    框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解) 一丶什么是RTTI,以及RTTI怎么设计 通过第一讲,我们知道了怎么样升成一个窗口了,以及简单的消息循环. 第二讲则是主要讲解RTTI ...

  2. MFC原理第三讲.RTTI运行时类型识别

    MFC原理第三讲.RTTI运行时类型识别 一丶什么是RTTI RTTI. 运行时的时候类型的识别. 运行时类型信息程序.能够使用基类(父类)指针 或者引用 来检查这些指针或者引用所指的对象. 实际派生 ...

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

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

  4. RTTI (Run-Time Type Identification,通过运行时类型识别) 转

    参考一: RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型.   RTTI提供了以下两个 ...

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

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

  6. Java基础之RTTI 运行时类型识别

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

  7. Java进阶(四)Java反射TypeToken解决泛型运行时类型擦除问题

    在开发时,遇到了下面这条语句,不懂,然习之. private List<MyZhuiHaoDetailModel> listLottery = new ArrayList<MyZhu ...

  8. 【JavaSE】运行时类型信息(RTTI、反射)

    运行时类型信息使得你可以在程序运行时发现和使用类型信息.--<Think in java 4th> **** 通常我们在面向对象的程序设计中我们经常使用多态特性使得大部分代码尽可能地少了解 ...

  9. C++运行时类型识别

    通过运行时类型识别(RTTI),程序能够使用基类的指针或引用来检索这些指针或引用所指对象的实际派生类型. 通过下面两个操作符提供 RTTI: 1. typeid 操作符,返回指针或引用所指对象的实际类 ...

随机推荐

  1. C#对SQLite、Access数据库操作的封装,很好用的~

    1.对SQLite的封装: using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  2. vuejs(2.0)基础笔记

    基本结构 <div id="app"> {{ message }} </div> var app = new Vue({ el: '#wrap', data ...

  3. JavaScript中typeof,instanceof,hasOwnProperty,in的用法和区别

    一. typeof操作符 typeof操作符用于返回正在使用值的类型. // 使用原始值 let mNull = null; let mUndefined = undefined; let mStri ...

  4. python3.5安装pyHook,解决【TypeError: MouseSwitch() missing 8 required positional arguments: 'msg', 'x', 'y', 'data', 'time', 'hwnd', and 'window_name'】这个错误!

    为什么安装 pyHook包:为Windows中的全局鼠标和键盘事件提供回调. Python应用程序为用户输入事件注册事件处理程序,例如鼠标左键,鼠标左键,键盘键等 先要实时获取系统的鼠标位置或者键盘输 ...

  5. 如何在仅主机模式下ping通网路上网

    1 主机的控制面板,找到电脑的实际网卡,勾选,并选择VMware Network Adapter VMnet1 找到虚拟网卡VMware Virtual Ethernet Adapter for VM ...

  6. 使用Bitbucket Pipeline进行.Net Core项目的自动构建、测试和部署

    1. 引言 首先,Bitbucket提供支持Mercurial和Git版本控制系统的网络托管服务.简单来说,它类似于GitHub,不同之处在于它支持个人免费创建私有项目仓库.除此之外,Bitbucke ...

  7. hdu 3829 Cat VS Dog 二分匹配 最大独立点集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3829 题目大意: 给定N个猫,M个狗,P个小朋友,每个小朋友都有喜欢或者不喜欢的某猫或者某狗 管理员从 ...

  8. HDU2159--二维费用背包,三重背包

    FATE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  9. PHP进程锁

    <?php /** * CacheLock 进程锁,主要用来进行cache失效时的单进程cache获取,防止过多的SQL请求穿透到数据库 * 用于解决PHP在并发时候的锁控制,通过文件/eacc ...

  10. 怎么配置Jupyter Notebook默认启动目录?

    前言 系统环境:win10 x64:跟环境也没啥关系,在LInux下也一样... 前段时间重换了系统后,发现Jupyter Notebook的默认启动目录不太对呀,所以,就翻到了以前的笔记,还是记在这 ...