…………
…………
static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name); \
CRuntimeClass* class_name::GetRuntimeClass() const \
{ return &class_name::class##class_name; } \……
……
……
#include "my.h" // it should be mfc.h, but for CMyWinApp definition, so...extern CMyWinApp theApp;static char szCObject[] = "CObject";
struct CRuntimeClass CObject::classCObject =
{ szCObject, sizeof(CObject), 0xffff, NULL, NULL };
static AFX_CLASSINIT _init_CObject(&CObject::classCObject);CRuntimeClass* CRuntimeClass::pFirstClass = NULL;AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass* pNewClass) 这个是怎样把链表连上的?
{
pNewClass->m_pNextClass = CRuntimeClass::pFirstClass;
CRuntimeClass::pFirstClass = pNewClass;
}CRuntimeClass* CObject::GetRuntimeClass() const
{
return &CObject::classCObject;
}……
…………
…………
static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name); \
CRuntimeClass* class_name::GetRuntimeClass() const \
{ return &class_name::class##class_name; } \……
……
……
#include "my.h" // it should be mfc.h, but for CMyWinApp definition, so...extern CMyWinApp theApp;static char szCObject[] = "CObject";
struct CRuntimeClass CObject::classCObject =
{ szCObject, sizeof(CObject), 0xffff, NULL, NULL };
static AFX_CLASSINIT _init_CObject(&CObject::classCObject);CRuntimeClass* CRuntimeClass::pFirstClass = NULL;AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass* pNewClass) 这个是怎样把链表连上的?
{
pNewClass->m_pNextClass = CRuntimeClass::pFirstClass;
CRuntimeClass::pFirstClass = pNewClass;
}CRuntimeClass* CObject::GetRuntimeClass() const
{
return &CObject::classCObject;
}……
…………
解决方案 »
- CFile不弹出错误对话框
- 关于WM_CHAR和MessageBox
- 请问:我在打开 时出现了一个“Parsing error: Expected"virtual" Input Line :"vector<CData> m_data:"对话框,这是怎么回事呀??
- 视频播放窗口的简单问题
- 这里有PCI,USB的技术规范,还有MP3的编解码规范。
- 谁知道关于农历到阳历地转换算法?
- 又是一个CTreeCtrl的问题!
- 控件有消息循环吗?
- mfc如何通过子对话框关闭父对话框
- 初学vc,有这样一个疑问,学VC非用MFC吗?
- 感谢csdn_cht(欣欣兽)在http://community.csdn.net/Expert/topic/3262/3262619.xml?temp=.9848596跟贴,请跟贴接分
- 如何在工具栏的按钮里添加位图?
static CRuntimeClass::pFirstClass,整个MFC的CRuntimeClass的链表是倒插入的。
然后就是AFX_CLASSINIT这是一个结构体,不过在C++中结构也是一种类,而这个类有一个构造函数
AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass* pNewClass)
{
pNewClass->m_pNextClass = CRuntimeClass::pFirstClass; //静态链表头指针
CRuntimeClass::pFirstClass = pNewClass;
}然后在每个类得.cpp文件中插入宏 DECLARE_DYNAMIC(classname);
这个宏的定义为:
#define DECLARE_DYNAMIC(classname)\
...
...
static AFX_CLASSINIT _init##classname(classname::class##classname);\ //在这里声明了严格AFX_CLASSINIT的对象,而引发了该对象的构造函数。而这个构造函数将链表连上的...
...
这行是用来干什么的?static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name);
这个定义什么?是结构体的构造函数?AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass* pNewClass)
这行也看不明白
这行是用声明一个AFX_CLASSINIT类得对象。因为这个类得构造函数需要一个CRuntiemClass的参数来连接连表。static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name);
是结构体的静态变量声明,因为是以宏的形式定义,在编译时要做宏代换,代换后的形式就是第一行的样子。AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass* pNewClass)
这行是结构体构造函数的函数定义。
事实上是这样的:AFX_CLASSINIT是个结构体,但正如楼上所说,在C++中结构体是可以有构造函数的。
AFX_CLASSINIT(CRuntimeClass* pNewClass) 就是AFX_CLASSINIT的构造函数。在MFC中是这样定义的:
struct AFX_CLASSINIT
{
AFX_CLASSINIT(CRuntimeClass* pNewClass)
{
AfxClassInit(pNewClass);
}
};AFX_CLASSINIT的构造函数调用AfxClassInit(pNewClass)。AfxClassInit函数内容如下:
void AFXAPI AfxClassInit(CRuntimeClass* pNewClass)
{
AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
AfxLockGlobals(CRIT_RUNTIMECLASSLIST);
pModuleState->m_classList.AddHead(pNewClass);
AfxUnlockGlobals(CRIT_RUNTIMECLASSLIST);
}
而 AFX_MUODULE_STATE 是一个继承自 CNoTrackObject 的类,类中有一个链表,为了实现RTTI的能力保存类的信息。
CTypedSimpleList<CRuntimeClass*> m_classList;CTypedSimpleList是微软自己定义的一个类。
may you success
我大二上学期买的书,不是常常看,还有学业。现刚毕业。
可能我的基础太低,在学校瞎学了C,自学了C++,就看起了MFC。看第三章有十几遍了吧,从看了就晕到有点明白。
能不能介绍点经验啊?