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

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

一丶什么是RTTI,以及RTTI怎么设计

通过第一讲,我们知道了怎么样升成一个窗口了,以及简单的消息循环.

第二讲则是主要讲解RTTI

什么是RTTI,RTTI 简单来多就是我根据一个字符串,来new一个对象

例如:

  CObject * pThis = (Cobject *)Getobj("CObject"); 反回的是实例对象

但是具体怎么做

首先我们要解决的问题

1.我们要知道子类的名字

2.怎么识别子类的父类

关于第一种,我们可以在我们每个框架里面,添加一个虚函数,名字叫做 GetClassName既可.

第二种,关键是怎么识别子类和父类.

这就比较难办了.此时我们可以给每个类中加入一个静态的链表

链表保存的信息

class CRtti { public:   const char *pClasName;   CRtti *pBase;   void* (*CreateObj)(); };

第一个我们可以给自己的类名

第二个我们可以给父类的对象

第三个我们可以给个函数指针,而且每个类中都要实现这个函数指针.这样我们就可以保存自己的名字,以及父类的信息了.

关于为什么是链表保存,这个就属于是设计了.

二丶MFC中的RTTI

通过上面的讲解,我们理解了什么是RTTI,那么对应到MFC的框架中,我们看一下MFC是怎么做的

class CMyRuntimeClass
{
public:
  // Attributes
  LPCSTR m_lpszClassName;        //名字
  int m_nObjectSize;           //对象大小
  UINT m_wSchema;            //版本号
  CMyObject* (*m_pfnCreateObject)();  //创建对象的函数指针
  CMyRuntimeClass* m_pBaseClass;    //基类
  CMyRuntimeClass* m_pNextClass;    //下一个基类
  void *pInit;              //初始化数据
};

可以看出,MFC框架中,成员保存的比我们的多,且加了很多额外属性

但是核心属性是不变的.

三丶理解RTTI的实现,以及框架过程.

在新的框架中,我们仿照MFC 分别添加了

1. CMyMainFrom 类,  这个类是框架类

2. CMyView类    视图类

3. CMyDocument,        数据类

上面三个是框架类

而当我们点击类向导的时候,会自动生成的,现在是添加用户自己的类

1.CTestDoc  继承  CMyDocument

2.CTestFrom继承  CMyMainFrom

3.CTestView继承  CMyView

既然我们了解了RTTI类型识别,那么我们就要设计,并且实现了.

一丶CMyObject中添加类型识别.

声明和实现我们用宏替代.

二丶CMyObject中添加实现方法

实现

实现一,初始化RTTI表

实现二,函数返回自己本身.

 三丶每个类中都添加RTTI表,并且初始化

每个类中都添加相同的静态成员,所以很麻烦,为了减少代码量,所以都变成了上面的宏了.

MY_DECLARE_DYNAMIC 这个宏是我们上面定义的.直接添加类成员的.

实现

每个框架类实现这个既可.

代码下载:

  链接:https://pan.baidu.com/s/1hsOsfMO 密码:m1xo

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java帮帮-微信公众号-技术文章全总结

【选择题】Java基础测试八(16道)

【选择题】Java基础测试八(16道) 101.下面哪个流类属于面向字符的输入流( D ) A)BufferedWriter ...

5256
来自专栏Java爬坑系列

你不可不知的Java引用类型之——Reference源码解析

reference指代引用对象本身,referent指代reference引用的对象,下文介绍会以reference,referent形式出现。

1041
来自专栏你不就像风一样

Java虚拟机性能监测工具Visual VM与OQL对象查询语言

Visual VM是一个功能强大的多合一故障诊断和性能监控的可视化工具,它集成了多种性能统计工具的功能,使用 Visual VM 可以代替jstat、jmap、...

2383
来自专栏企鹅号快讯

php的变量引用与销毁机制

在php中,符号"&"表示引用。 1、看看不引用的情况是这样子: $a = "hello world";//定义一个变量,下面赋值给$b $b = $a;//...

2819
来自专栏SDNLAB

【一课专栏】解构2 - 明察YangInstanceIdentifier

屈原《离骚》中云:“路漫漫其修远兮,吾将上下而求索”,其实,学习软件编程,学习SDN技术也是一个路漫漫,上下求索的过程。

2462
来自专栏Golang语言社区

转--Golang语言-- Web 编程

1.golang的安装工具 1.1 GVM 第三方开发的Go多版本管理工具 2.golang环境变量 2.1 GOROOT=D:\go (golang 安装目录...

3718
来自专栏吾爱乐享

short s=1;s=s+1; short s=1;s+=1; 有区别么?? 如果有的话区别是什么?

1513
来自专栏有趣的Python

2-Linux C语言指针与内存-学习笔记

为原来的变量值加上*, change函数改为传入&a &b 3和5可以成功的交换。

2133
来自专栏java一日一条

教你在Java接口中定义方法

接下来,SimpleTimeClient类实现了TimeClient接口,具体代码如下:

1022
来自专栏Jackson0714

C#多线程之旅(4)——APM初探

40813

扫码关注云+社区

领取腾讯云代金券