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

相关文章
|
编译器 C语言
QT编译fabs not declared in this scope
QT编译fabs not declared in this scope
177 0
|
小程序
小程序 define is not defined
小程序 define is not defined
154 0
|
7月前
|
存储 安全 编译器
【C++ 多态 】深入理解C++的运行时类型信息(RTTI):dynamic_cast和typeid的应用与原理
【C++ 多态 】深入理解C++的运行时类型信息(RTTI):dynamic_cast和typeid的应用与原理
497 1
|
7月前
|
人工智能 安全 机器人
【C++】dynamic_cast基本用法(详细讲解)
【C++】dynamic_cast基本用法(详细讲解)
|
7月前
|
算法 安全 C++
C++ Effective Modern Pointer (智能指针模块)
C++ Effective Modern Pointer (智能指针模块)
|
7月前
|
C++
[C++] 强制类型转换(dynamic_cast和dynamic_Pointer_cast)
[C++] 强制类型转换(dynamic_cast和dynamic_Pointer_cast)
116 1
|
编译器
USES_CONVERSION宏定义
USES_CONVERSION宏定义
335 0
|
前端开发 Android开发 Kotlin
【错误记录】Kotlin 编译报错 ( Smart cast to ‘Xxx‘ is impossible, because ‘xxx‘ is a mutable property ... )
【错误记录】Kotlin 编译报错 ( Smart cast to ‘Xxx‘ is impossible, because ‘xxx‘ is a mutable property ... )
692 0
【错误记录】Kotlin 编译报错 ( Smart cast to ‘Xxx‘ is impossible, because ‘xxx‘ is a mutable property ... )