24小时热门版块排行榜    

CyRhmU.jpeg
查看: 824  |  回复: 1
【奖励】 本帖被评价1次,作者yuancongsen增加金币 0.6

yuancongsen

银虫 (小有名气)


[资源] 【讨论】AFX_CLASSINIT真正的定义

AFX_CLASSINIT真正的定义
这是《深入浅出MFC》里面的定义,但是看看源代码。
struct AFX_CLASSINIT
{ AFX_CLASSINIT(CRuntimeClass *pNewClass); };
AFX_CLASSINIT :: AFX_CLASSINIT(CRuntimeClass *pNewClass)
{
pNewClass->m_pNextClass = CRuntimeClass :: pFirstClass;
CRuntimeClass :: pFirstClass = pNewClass;
}
完成CRuntimeClass LinkList 链接
真的是这个样?分析过MFC源代码?如果看看源代码,提点问题便不会这个样子了,下面看真正的定义
struct AFX_CLASSINIT
{ AFX_CLASSINIT(CRuntimeClass* pNewClass) { AfxClassInit(pNewClass); } };
可见这里是调用AfxClassInit(pNewClass)这个函数来初始化的,这个函数的定义:
void AFXAPI AfxClassInit(CRuntimeClass* pNewClass)
{
AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
AfxLockGlobals(CRIT_RUNTIMECLASSLIST);
pModuleState->m_classList.AddHead(pNewClass);
AfxUnlockGlobals(CRIT_RUNTIMECLASSLIST);
}



MFC中CRunTimeClass疑问
2010年04月07日 星期三 上午 07:48
1.CRunTimeClass结构实际上组成了2种链表,一种是按照创建顺序组成的链表;另一种是基类同其派生类之间的所谓的”同宗“链(P109中的IsKindOf中),上例的同宗链应该如下所示:
ccmdtarget<--cwinthread<---cwinapp
2.关系的建立在IMPLEMENT_DYNAMIC宏中。P98-99源码如下:
#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}; static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name); CRuntimeClass* class_name::GetRuntimeClass() const {return &class_name::class##class_name;} ...
#define RUNTIME_CLASS(class_name) (&class_name::clas##class_name)

上述源码中_IMPLEMENT_RUNTIMECLASS宏定义的第三行就是给class_name类的CRuntimeClass数据成员赋值,根据变量和常量的对应关系,可以看到其中 m_pBaseClass的值为 RUNTIME_CLASS(base_class_name)------它的结果就是base_class_name类中CRuntimeClass成员的指针,从而使派生类的CRuntimeClass成员指向其基类的CRuntimeClass成员的地址,建立”同宗“链。
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
简单回复
mengxc2楼
2011-06-01 16:58   回复  
dubo(金币+1): 欢迎常来程序语言版讨论 2011-06-19 15:28:46
三星好评  
相关版块跳转 我要订阅楼主 yuancongsen 的主题更新
☆ 无星级 ★ 一星级 ★★★ 三星级 ★★★★★ 五星级
普通表情 高级回复(可上传附件)
信息提示
请填处理意见