#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了,则指向表头的指针已经丢失了啊,怎么连在一起???
但是在使用类对象_init_##class_name之前,他已经为结构体cruntimeclass中的pfirstclass赋值为NULL。
那么 AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass* pNewClass){ pNewClass->m_pNextClass = CRuntimeClass::pFirstClass; CRuntimeClass::pFirstClass = pNewClass;}
中的CRuntimeClass::pFirstClass已经变成NULL了,则指向表头的指针已经丢失了啊,怎么连在一起???
解决方案 »
- 已知四边形四个顶点,如何遍历四边形内的元素
- 搭建PPPOE拨号系统的设备问题?
- 如何把\Device\HarddiskVolume1转换成C:
- m_pRecordset.CreateInstance(__uuidof(RecordSet));
- 我想实现qq好友列表的现实效果,请高手指点。
- 请问关于界面皮肤的问题
- 当登陆局域网的一台机器时,将会出现一个登陆框,怎样用程序来控制这个对话框?
- 一个容易被忽略的问题,关于_T()宏
- 我想用位图填充多个不规则的区域,但是只能对一个填充,为什么啊?
- 大哥,大姐帮帮我,CSplitterWnd的问题。
- 图像拼接中纠偏差和融合有什么区别?
- cximage 类库的使用??
而CRuntimeClass::pFirstClass被赋值为此类,指向了插入后的表头位置。
pNewClass->m_pNextClass = CRuntimeClass::pFirstClass; CRuntimeClass::pFirstClass = pNewClass;
}
从这个可以看到链表是从表头插入的,动态创建了一个新class类以后,就将该class类的后一个class指向
CRuntimeClass::pFirstClass,然后更新表头,使CRuntimeClass::pFirstClass指向该新类。
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了啊!!为什么啊??