框架原理第三讲,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. while循环小练习-猜答案

    条件 1.每个用户只能猜10次产品的价格2.每次猜玩价格,提示用户价格是多了还是少了或者对了3.如果用户才对则终止程序执行 break! i = 0 #设置一个次数变量 price = 38 #设置一 ...

  2. 10. 管理Apache ZooKeeper配置

    Tips 有关ZooKeeper部署和管理的详细说明,请参阅官方文档http://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html. 1. 配置Zo ...

  3. C语言之逆序数

    #include<stdio.h>int main(){int num;int a,b,c,result,d,result1;scanf("%d",&num); ...

  4. Java数据结构和算法(五)——队列

    前面一篇博客我们讲解了并不像数组一样完全作为存储数据功能,而是作为构思算法的辅助工具的数据结构——栈,本篇博客我们介绍另外一个这样的工具——队列.栈是后进先出,而队列刚好相反,是先进先出. 1.队列的 ...

  5. Web Mining and Big Data 公开课学习笔记 ---lecture1

    1.1  LOOK Finding "stuff" on the web or computer or room or hidden in data Finding documen ...

  6. vue搭建环境

    大早起的,没想自己起来那么早,既然起来了,就写点东西吧~最近在看Vue的东西,发现网上也是好多的资源,包括博客和视频 , 我是看的慕课网上的vue ,名字忘记了,价格148的,看了,也整理了笔记,看了 ...

  7. mysql 各数据类型的 大小及长度

    数字型 类型 大小 范围(有符号) 范围(无符号) 用途 TINYINT 1 字节 (-128,127) (0,255) 小整数值 SMALLINT 2 字节 (-32 768,32 767) (0, ...

  8. float和double的区别

    1.float是单精度类型,精度有效数字为6位,超出则会四舍五入,取值范围为10的-38次方到10的38次方,float占用存储空间为4个字节. 2.double是双精度类型,精度有效数字为15位,超 ...

  9. 通过反射实现Microsoft Visual Studio International Pack 1.0 SR1里面的两个类

    这两天打算实现拼音和简繁转换的方法, 发现Microsoft Visual Studio International Pack 1.0 SR1 提供了 .    下载地址 但是基于某些原因, 一来下载 ...

  10. 翻煎饼 Stacks of Flapjacks

    题意:本题意为煎饼排序,大的放在上面,小的放在下面(此题输入是从上到下输入的),为煎饼排序是通过一系列的"翻转"动作来完成的.翻转动作就是将一个小铲插到一叠煎饼中的某两个煎饼之间, ...