1、CRuntimeClass结构
型录中的类别信息,以串行(linked list)方式串接起来,形成一个链表。
一个结构,内中至少需有类别名称、串行的Next 指针,以及串行的First 指针。由于First 指针属于全域变量,一份就好,所以它应该以static 修饰之。
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;// 指向当前对象的基类,由该成员列遍的的链表是一个类寻基线路,此线路与程序设计的核心思想直接相关static CRuntimeClass* pFirstClass; //链表头部,最后一个加入链表的类
CRuntimeClass* m_pNextClass; // 所有之前已注册类都应该在此成员开始列遍的链表中,此链路不一定一成不变};
2、DECLARE_DYNAMIC / IMPLEMENT_DYNAMIC宏
#define DECLARE_DYNAMIC(class_name) /
public: /
static CRuntimeClass class##class_name; /
virtual CRuntimeClass* GetRuntimeClass() const;
DECLARE_DYNAMIC用于在类中定义一个本类的CRuntimeClass结构
及一个获得该类的CRuntimeClass型别结构的函数
#define IMPLEMENT_DYNAMIC(class_name, base_class_name) /
_IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, NULL)
#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 }; /
//填充CRuntimeClass结构
static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name); /
CRuntimeClass* class_name::GetRuntimeClass() const /
{ return &class_name::class##class_name; }
//定义GetRuntimeClass()
#define RUNTIME_CLASS(class_name) /
(&class_name::class##class_name)
struct AFX_CLASSINIT
{ AFX_CLASSINIT(CRuntimeClass* pNewClass); };
AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass* pNewClass)
{
pNewClass->m_pNextClass = CRuntimeClass::pFirstClass;
CRuntimeClass::pFirstClass = pNewClass;
}
//利用结构体定义时的构造函数对链表头部进行添加成员处理