…………
…………
static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name); \
        CRuntimeClass* class_name::GetRuntimeClass() const \
                { return &class_name::class##class_name; } \……
……
……
#include "my.h"  // it should be mfc.h, but for CMyWinApp definition, so...extern CMyWinApp theApp;static char szCObject[] = "CObject";
struct CRuntimeClass CObject::classCObject =
        { szCObject, sizeof(CObject), 0xffff, NULL, NULL };
static AFX_CLASSINIT _init_CObject(&CObject::classCObject);CRuntimeClass* CRuntimeClass::pFirstClass = NULL;AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass* pNewClass)            这个是怎样把链表连上的?
{
        pNewClass->m_pNextClass = CRuntimeClass::pFirstClass;
        CRuntimeClass::pFirstClass = pNewClass;
}CRuntimeClass* CObject::GetRuntimeClass() const
{
        return &CObject::classCObject;
}……
…………

解决方案 »

  1.   

    RunTime Class Info是从CObject类开始的,你一个一个继承下来自然就形成一个链表啦.
      

  2.   

    首先在MFC中有一个静态的CRuntimeClass结构变量得头指针
    static CRuntimeClass::pFirstClass,整个MFC的CRuntimeClass的链表是倒插入的。
    然后就是AFX_CLASSINIT这是一个结构体,不过在C++中结构也是一种类,而这个类有一个构造函数
    AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass* pNewClass)
    {
       pNewClass->m_pNextClass = CRuntimeClass::pFirstClass;  //静态链表头指针
       CRuntimeClass::pFirstClass = pNewClass;
    }然后在每个类得.cpp文件中插入宏 DECLARE_DYNAMIC(classname);
    这个宏的定义为:
    #define DECLARE_DYNAMIC(classname)\
    ...
    ...
    static AFX_CLASSINIT _init##classname(classname::class##classname);\ //在这里声明了严格AFX_CLASSINIT的对象,而引发了该对象的构造函数。而这个构造函数将链表连上的...
    ...
      

  3.   

    static AFX_CLASSINIT _init_CObject(&CObject::classCObject);
    这行是用来干什么的?static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name);
    这个定义什么?是结构体的构造函数?AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass* pNewClass)
    这行也看不明白
      

  4.   

    static AFX_CLASSINIT _init_CObject(&CObject::classCObject);
    这行是用声明一个AFX_CLASSINIT类得对象。因为这个类得构造函数需要一个CRuntiemClass的参数来连接连表。static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name);
    是结构体的静态变量声明,因为是以宏的形式定义,在编译时要做宏代换,代换后的形式就是第一行的样子。AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass* pNewClass)
    这行是结构体构造函数的函数定义。
      

  5.   

    《深入浅出MFC》中讲到“勿在浮沙筑高台”,其实上面的问题应该都是C++的知识,而不是MFC的东西。
      

  6.   

    我再补充一点点。
    事实上是这样的:AFX_CLASSINIT是个结构体,但正如楼上所说,在C++中结构体是可以有构造函数的。
    AFX_CLASSINIT(CRuntimeClass* pNewClass) 就是AFX_CLASSINIT的构造函数。在MFC中是这样定义的:
    struct AFX_CLASSINIT
    {
        AFX_CLASSINIT(CRuntimeClass* pNewClass)
        {
            AfxClassInit(pNewClass);
        }
    };AFX_CLASSINIT的构造函数调用AfxClassInit(pNewClass)。AfxClassInit函数内容如下:
    void AFXAPI AfxClassInit(CRuntimeClass* pNewClass)
    {
    AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
    AfxLockGlobals(CRIT_RUNTIMECLASSLIST);
    pModuleState->m_classList.AddHead(pNewClass);
    AfxUnlockGlobals(CRIT_RUNTIMECLASSLIST);
    }
    而 AFX_MUODULE_STATE 是一个继承自 CNoTrackObject 的类,类中有一个链表,为了实现RTTI的能力保存类的信息。
    CTypedSimpleList<CRuntimeClass*> m_classList;CTypedSimpleList是微软自己定义的一个类。
      

  7.   

    嗯,把主要的意思看懂,不要过于追求细节,等你以后的认识深了,以前的问题说不定就都懂了。
    may you success
      

  8.   

    问一下,各位看这书有多长时间了?
    我大二上学期买的书,不是常常看,还有学业。现刚毕业。
    可能我的基础太低,在学校瞎学了C,自学了C++,就看起了MFC。看第三章有十几遍了吧,从看了就晕到有点明白。
    能不能介绍点经验啊?