MFC RTTI (DECLARE_DYNAMIC 及IMPLEMENT_DYNAMIC 宏)

简介: 1.1     链表元素CRuntimeClass 当达到RTTI的能力必须要达到一种能力就是在构建类的时候记录必要信息,以建立型录。型录中的类住处最好以链表的形式存。 链表元素将以 CRuntimeClass描述 struct CRuntimeClass { // Attributes ...

1.1     链表元素CRuntimeClass

当达到RTTI的能力必须要达到一种能力就是在构建类的时候记录必要信息,以建立型录。型录中的类住处最好以链表的形式存。

链表元素将以 CRuntimeClass描述

struct CRuntimeClass

{

// Attributes

        LPCSTR m_lpszClassName;

        int m_nObjectSize;

        UINT m_wSchema; // schema number of the loaded class

        CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class

        CRuntimeClass* m_pBaseClass;

 

        // CRuntimeClass objects linked together in simple list

        static CRuntimeClass* pFirstClass; // start of class list

        CRuntimeClass* m_pNextClass;       // linked list of registered classes

};

 

struct AFX_CLASSINIT

{

AFX_CLASSINIT(CRuntimeClass* pNewClass);

};

 

每一个类都有一个CRuntimeClass的成员变量。命名规则为 “class类名”。

1.2     宏

1.2.1  DECLARE_DYNAMIC

说明:

1.声明CRuntimeClass的静态变量,变量名为 class+类名

2静态成员函数CRuntimeClass* GetRuntimeClass()const 来获取当前类CRuntimeClass静态成员的指针。

class CCmdTarget : public CObject

{

        DECLARE_DYNAMIC(CCmdTarget)

                   /*展开的话*/

/*

public:

         static CRuntimeClass classCCmdTarget;            //声明一个CRuntimeClass的变量

         virtual CRuntimeClass* GetRuntimeClass() const;  //声明一个函数GetRuntimeClass返回一个CRuntimeClass*

*/

 

1.2.2  IMPLEMENT_DYNAMIC

说明:此宏实现以下行为

  1. 初始化当前类的CRuntimeClass类型的成员变量。 初始化方式如下:
    m_lpszClassName=类名
    m_nObjectSize=sizeof(类)
    m_wSchema= 0xffff
    m_pfnCreateObject =NULL
    m_pBaseClass=指向父类的CRuntimeClass的指针
    m_pNextClass=NULL
  2. 初始化类静态成员CRuntimeClass的变量
    新类的CRuntime的成员m_pNextClass= CRuntimeClass::pFirstClasse
    CRuntimeClass::pFirstClass = pNewClass;

    这的意思是类成员classCRuntimeClass成员的pNext指向 CRuntimeClass::pFirstClasse;然后CRuntimeClass::pFirstClasse这个指针又指向了classCRuntimeClass这个类成员对象

说明:
CRuntimeClass::pFirstClasse这个指针始终指向最后一个类的’class类名’

最后一个类的’class类名’的next成员始终指向他父类的 ‘class类名’

 

IMPLEMENT_DYNAMIC(CCmdTarget, CObject) 

/*

CCmdTarget.classCCmdTarget={"CCmdTGarget",sizeof(CCmdTarget),0xffff,NULL,&CObject.classCObject,NULL};

CCmdTarget.classCCmdTarget.m_pNextClass=CRuntimeClass::pFirstClass;

CRuntimeClass::pFirstClass=CCmdTarget.classCCmdTarget;

*/

 

 

参考:深入浅出MFC

相关文章
|
XML 安全 Android开发
Flutter配置Android和IOS允许http访问
Flutter配置Android和IOS允许http访问
430 3
|
11月前
|
设计模式 PHP 开发者
PHP在Web开发中的平台优势与未来展望###
【10月更文挑战第17天】 本文探讨了PHP作为服务器端脚本语言在Web开发领域的持久魅力与独特优势,从其易于学习、成本效益高、强大社区支持到灵活的框架生态,展现了PHP为何能在全球网站开发中占据重要地位。同时,文章也展望了PHP在未来技术趋势下,如云计算、微服务架构中的发展潜力,强调持续创新对于保持其竞争力的重要性。 ###
86 2
|
资源调度 JavaScript
vue项目:集成富文本编辑器 - 百度ueditor(vue-ueditor-wrap)
vue项目:集成富文本编辑器 - 百度ueditor(vue-ueditor-wrap)
1324 0
|
缓存 Java Spring
Spring中refresh分析之prepareRefresh方法详解
Spring中refresh分析之prepareRefresh方法详解
222 0
|
存储 测试技术
俄罗斯方块游戏系统的设计与实现(源码+论文)_kaic
俄罗斯方块游戏系统的设计与实现(源码+论文)_kaic
|
存储 缓存 NoSQL
玩转Spring Cache --- 整合进程缓存之王Caffeine Cache和Ehcache3.x【享学Spring】(上)
玩转Spring Cache --- 整合进程缓存之王Caffeine Cache和Ehcache3.x【享学Spring】(上)
玩转Spring Cache --- 整合进程缓存之王Caffeine Cache和Ehcache3.x【享学Spring】(上)
|
前端开发 安全 UED
CSS——字体选择
CSS——字体选择
287 0
|
1天前
|
人工智能 运维 安全
|
4天前
|
SpringCloudAlibaba 负载均衡 Dubbo
微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?
本文对比分析了SpringCloudAlibaba框架下Feign与Dubbo的服务调用性能及差异。Feign基于HTTP协议,使用简单,适合轻量级微服务架构;Dubbo采用RPC通信,性能更优,支持丰富的服务治理功能。通过实际测试,Dubbo在调用性能、负载均衡和服务发现方面表现更出色。两者各有适用场景,可根据项目需求灵活选择。
377 124
微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?