且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

MFC RTTI (DECLARE_DYNAMIC 及IMPLEMENT_DYNAMIC 宏)

更新时间:2022-09-13 16:56:29

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