24小时热门版块排行榜    

查看: 836  |  回复: 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 的主题更新
☆ 无星级 ★ 一星级 ★★★ 三星级 ★★★★★ 五星级
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 材料工程专硕274一志愿211求调剂 +6 薛云鹏 2026-03-15 6/300 2026-03-17 11:05 by 学员h26Tkc
[考研] 化学工程321分求调剂 +10 大米饭! 2026-03-15 13/650 2026-03-17 06:57 by laoshidan
[考研] 341求调剂 +5 捣蛋猪猪 2026-03-11 5/250 2026-03-17 06:56 by Muziwl
[考研] 0703化学336分求调剂 +3 zbzihdhd 2026-03-15 4/200 2026-03-16 23:52 by zbzihdhd
[考研] 东南大学364求调剂 +5 JasonYuiui 2026-03-15 5/250 2026-03-16 21:28 by 木瓜膏
[考研] 考研化学学硕调剂,一志愿985 +3 张vvvv 2026-03-15 5/250 2026-03-16 20:25 by 张vvvv
[考研] 0854控制工程 359求调剂 可跨专业 +3 626776879 2026-03-14 9/450 2026-03-16 17:42 by 626776879
[考研] 304求调剂 +5 素年祭语 2026-03-15 5/250 2026-03-16 17:00 by 我的船我的海
[考研] 一志愿211 0703方向310分求调剂 +3 努力奋斗112 2026-03-15 3/150 2026-03-16 16:44 by houyaoxu
[考博] 东华理工大学化材专业26届硕士博士申请 +6 zlingli 2026-03-13 6/300 2026-03-15 20:00 by ryzcf
[考研] 080500,材料学硕302分求调剂学校 +4 初识可乐 2026-03-14 5/250 2026-03-14 21:08 by peike
[考研] 328求调剂 +3 5201314Lsy! 2026-03-13 6/300 2026-03-14 15:31 by hyswxzs
[考研] 331求调剂(0703有机化学 +5 ZY-05 2026-03-13 6/300 2026-03-14 10:51 by Jy?
[考研] 招收0805(材料)调剂 +3 18595523086 2026-03-13 3/150 2026-03-14 00:33 by 123%、
[考研] 336求调剂 +6 Iuruoh 2026-03-11 6/300 2026-03-13 22:06 by JourneyLucky
[考研] 工科,求调剂 +3 我887 2026-03-11 3/150 2026-03-13 21:39 by JourneyLucky
[考研] 材料专硕350 求调剂 +4 王金科 2026-03-12 4/200 2026-03-13 16:02 by ruiyingmiao
[论文投稿] 投稿问题 5+4 星光灿烂xt 2026-03-12 6/300 2026-03-13 14:17 by god_tian
[考研] 321求调剂(食品/专硕) +3 xc321 2026-03-12 6/300 2026-03-13 08:45 by xc321
[考博] 26读博 +4 Rui135246 2026-03-12 10/500 2026-03-13 07:15 by gaobiao
信息提示
请填处理意见