在此书中第二章中讲述RTTI(执行期类型识别)一段中讲解 DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC宏 中_IMPLEMENT_RUNTIMECLASS宏定义中有一个static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name);
这个函数是作什么用的?比如在CView类中宏的展开为
ststatic AFX_CLASSINIT _init_CView(&CView::classCView);
这个函数是作什么用的,是不是用来进行类初始化的?

解决方案 »

  1.   

    AFX_CLASSINIT是个结构体,这个函数的定义是:
    struct AFX_CLASSINIT
    {
      AFX_CLASSINIT(CRuntimeClass* pNewClass);};AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass* pNewClass)
    {
      pNewClass->m_pNextClass=CRuntimeClass::pFirstClass;
      CRuntimeClass::pFirstClass=pNewClass;
    }
    它负责链表的连接;
      

  2.   

    它负责初始化CRuntimeClass类型的静态成员变量class#class_name
      

  3.   

    链表的连接
    struct AFX_CLASSINIT
    {
      AFX_CLASSINIT(CRuntimeClass* pNewClass);
    };AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass* pNewClass)
    {
      pNewClass->m_pNextClass=CRuntimeClass::pFirstClass;
      CRuntimeClass::pFirstClass=pNewClass;
    }
    请注意连接的次序!
      

  4.   

    AFX_CLASSINIT是个结构体,
    struct AFX_CLASSINIT
    {
      AFX_CLASSINIT(CRuntimeClass* pNewClass);
    };
    该结构体有一个构造函数如下:
    AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass* pNewClass)
    {
      pNewClass->m_pNextClass=CRuntimeClass::pFirstClass;
      CRuntimeClass::pFirstClass=pNewClass;
    }
    此构造函数负责RTTI类型识别网链表的连接;其中链表的头部有定义:
    CRuntimeClass* CRuntimeClass::pFirstClass = NULL;以上在  深入浅出MFC  书上都有!