#defineDECLARE_DYNAMIC(class_name) \
public: \
static CRuntimeClass class##class_name; \
virtual CRuntimeClass* GetRuntimeClass() const;
#defineIMPLEMENT_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 }; \
static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name); \
CRuntimeClass* class_name::GetRuntimeClass() const \
{ return &class_name::class##class_name; } \
#defineRUNTIME_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;
}
一个宏展开的例子:
//头文件.h中的CView声明
class CView : public CWnd
{
DECLARE_DYNAMIC(CView)
......
};
//实现代码的.cpp文件中的代码
IMPLEMENT_DYNAMIC(CView, CWnd)
编译器宏展开之后将生成以下代码:
.h中的代码
class CView : public CWnd
{
public:
static CRuntimeClass classCView; //定义一个静态变量
virtual CRuntimeClass* GetRuntimeClass() const; //定义一个读上面变量的函数
......
};
.cpp中的代码
//先定义并初始化一个名字,这只是一个字符串
static char _lpszCView[] = "CView";
//类中的静态成员变量是需要初始化的,下面几行就是初始化动作
CRuntimeClass CView::classCView = {
_lpszCView, sizeof(CView), 0xFFFF, NULL,
&CWnd::classCWnd, NULL; }
static AFX_CLASSINIT _init_CView(&CView::classCView);
CRuntimeClass* CView::GetRuntimeClass() const
{return &CView::classCView;}
//而链表的头需要特别处理,所以要在在CObject类的声明和实现代码中进行
//in header file
class CObject
{
public:
virtual CRuntimeClass* GetRuntimeClass() const;
...
public:
static CRuntimeClass classCObject;
};
//in implement file
static char szCObject[]="CObject";
struct CRuntimeClass CObject::classCObject=
{szCObject,sizeof(CObject),0xFFFF,NULL,NULL,NULL};
static AFX_CLASSINIT _init_CObject(&CObject::classCObject);
CRuntimeClass* CObject::GetRuntimeClass const
{
return &CObject::classCObject;
}
//并且CRuntimeClass中的静态成员需要初始化
CRuntimeClass* CRuntimeClass::pFirstClass=NULL;
//这样,“类别型录”链表的头部就形成了。