#define _IMPLEMENT_RUNTIMECLASS(class_name, base_class_name,wSchema,pfnNew) \        static char _lpsz##class_name[] = #class_name; \        CRuntimeClass class_name::class##class_name = { \                _lpsz##class_name, sizeof(class_name), wSchema, pfnNew, \                        RUNTIME_CLASS(base_class_name), NULL }; \        static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name); \        CRuntimeClass* class_name::GetRuntimeClass() const \                { return &class_name::class##class_name; } \其中又有RUNTIME_CLASS 宏,定义如下:#define RUNTIME_CLASS(class_name) \        (&class_name::class##class_name)看起来整个IMPLEMENT_DYNAMIC 内容好象只是指定初值,不然,其曼妙处在于它所使用的一个struct AFX_CLASSINIT,定义如下:struct AFX_CLASSINIT        { AFX_CLASSINIT(CRuntimeClass* pNewClass); };这表示它有一个构造式(别惊讶,C++ 的struct 与class 都有构造式),定义如下:AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass* pNewClass){        pNewClass->m_pNextClass = CRuntimeClass::pFirstClass;        CRuntimeClass::pFirstClass = pNewClass;}很明显,此构造式负责linked list 的串接工作。——————————————————————————————————————————————————————这是书中关于cRuntimeClass的一段话。他在增加结点的时候用类afx_classinit来给cRuntimeClass中的m_pnextclass赋值。
但是在使用类对象_init_##class_name之前,他已经为结构体cruntimeclass中的pfirstclass赋值为NULL。
那么 AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass* pNewClass){        pNewClass->m_pNextClass = CRuntimeClass::pFirstClass;        CRuntimeClass::pFirstClass = pNewClass;}
中的CRuntimeClass::pFirstClass已经变成NULL了,则指向表头的指针已经丢失了啊,怎么连在一起???

解决方案 »

  1.   

    pFirstClass是static的,它是属于类的,不属于对象,怎么可能在对象中赋值??它的初值在开始被设为NULL,在从基类向子类构造的过程中,不断得插入到头节点前面。而pFirstClass也不断的被赋值。
      

  2.   

    链表是从头插入的,所以第一个插入链表的节点的m_pNextClass当然会赋值为空,
    而CRuntimeClass::pFirstClass被赋值为此类,指向了插入后的表头位置。
      

  3.   

    CRuntimeClass::pFirstClass;可以看出pFirstClass是CRuntimeClass的静态成员AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass* pNewClass){
      pNewClass->m_pNextClass = CRuntimeClass::pFirstClass;  CRuntimeClass::pFirstClass = pNewClass;
    }
    从这个可以看到链表是从表头插入的,动态创建了一个新class类以后,就将该class类的后一个class指向
    CRuntimeClass::pFirstClass,然后更新表头,使CRuntimeClass::pFirstClass指向该新类。
      

  4.   

    哎,看了你们说的我还是没看清楚。
    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 registerd classes};
    这是cruntime的结构定义。在_implement_dynamic中 CRuntimeClass class_name::class##class_name = { \  _lpsz##class_name, sizeof(class_name), wSchema, pfnNew, \  RUNTIME_CLASS(base_class_name), NULL }; 
    第六项static CRuntimeClass* pFirstClass被赋予NULL。这样不是把先前存储在pFirstClass中的值给弄没了吗?如果此时再在这个cruntimeclass结点前面插入一个结点,应该是新插入结点的next指针指向pFirstClass指向的结点。但是pFirstClass已经被赋予NULL了啊!!为什么啊??
      

  5.   

    1楼你说的有问题吧!static是静态的,属于类本身的,但是也可以在对象中赋值。赋值后改变他的值罢了不过我明白我那里想错了,我想成先初始化pfirstclass为NULL,然后新加一个结点给它赋值。再加一个结点的时候又初始化为NULL,然后再赋值。应该是这些所有的结点都初始化过了,再进行一轮一轮的赋值。是这样的不?