按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
{
return &CObject::classCObject;
}
并且,CRuntimeClass 中的static 成员变量应该要初始化(如果你忘记了,赶快复习第
2章的「静态成员(变量与函数)」一节):
// in implementation file
CRuntimeClass* CRuntimeClass::pFirstClass = NULL;
终于,整个「类别型录」串行的头部就这样形成了:
CObject::classCObject
“CObject”
sizeof(CObject)
CRuntimeClass::pFirstClass 0xFFFF
(static
变量) m_pfnCreateObject NULL
m_pBaseClass NULL
m_pNextClass
NULL
128
…………………………………………………………Page 191……………………………………………………………
第3章 MFC 六大關鍵技術之模擬
范例程序Frame3 在。h 档中有这些类别声明:
CObject
CObject
CCmdTarget
CCmdTarget
CWinThread
CWinThread
CWinApp
CWinApp
CMyWinApp
CMyWinApp
CWnd
CWnd
CView
CMyView
CMyView
CFrameWnd
CFrameWnd
CMyFrameWnd
CMyFrameWnd
CDocument
CDocument
CMyDoc
CMyDoc
class CObject
{
。。。
};
class CCmdTarget : public CObject
{
DECLARE_DYNAMIC(CCmdTarget)
。。。
};
class CWinThread : public CCmdTarget
{
DECLARE_DYNAMIC(CWinThread)
。。。
};
class CWinApp : public CWinThread
{
DECLARE_DYNAMIC(CWinApp)
。。。
};
class CDocument : public CCmdTarget
{
DECLARE_DYNAMIC(CDocument)
129
…………………………………………………………Page 192……………………………………………………………
第篇 勿在浮砂築高台
。。。
};
class CWnd : public CCmdTarget
{
DECLARE_DYNAMIC(CWnd)
// 其实在MFC 中是DECLARE_DYNCREATE(),见下节。
。。。
};
class CFrameWnd : public CWnd
{
// 其实在MFC 中是DECLARE_DYNCREATE(),见下节。
DECLARE_DYNAMIC(CFrameWnd)
。。。
};
class CView : public CWnd
{
DECLARE_DYNAMIC(CView)
。。。
};
class CMyWinApp : public CWinApp
{
。。。
};
class CMyFrameWnd : public CFrameWnd
{
。。。 // 其实在MFC 应用程序中这里也有DECLARE_DYNCREATE(),见下节。
};
class CMyDoc : public CDocument
{
。。。 // 其实在MFC 应用程序中这里也有DECLARE_DYNCREATE(),见下节。
};
class CMyView : public CView
{
。。。 // 其实在MFC 应用程序中这里也有DECLARE_DYNCREATE(),见下节。
};
范例程序Frame3 在。cpp 档中有这些动作:
IMPLEMENT_DYNAMIC(CCmdTarget; CObject)
IMPLEMENT_DYNAMIC(CWinThread; CCmdTarget)
IMPLEMENT_DYNAMIC(CWinApp; CWinThread)
IMPLEMENT_DYNAMIC(CWnd; CCmdTarget) // 其实在MFC 中它是IMPLEMENT_DYNCREATE(),见下节。
IMPLEMENT_DYNAMIC(CFrameWnd; CWnd) // 其实在MFC 中它是IMPLEMENT_DYNCREATE(),见下节。
IMPLEMENT_DYNAMIC(CDocument; CCmdTarget)
IMPLEMENT_DYNAMIC(CView; CWnd)
于是组织出图3…1 这样一个大网。
130
…………………………………………………………Page 193……………………………………………………………
第3章 MFC 六大關鍵技術之模擬
CObject::classCObject CCmdTarget::classCCmdTarget CWinThread::classCWinThread
“CObject” “CCmdTarget” “CWinThread”
m_pBaseClass m_pBaseClass m_pBaseClass
m_pNextClass m_pNextClass m_pNextClass
NULL
NULL
CFrameWnd::classCFrameWnd CWnd::classCWnd CWinApp::classCWinApp
“CFrameWnd” “CWnd” “CWinApp”
m_pBaseClass m_pBaseClass m_pBaseClass
m_pNextClass m_pNextClass m_pNextClass
CDocument::classCDocument CView::classCView
“CDocument” “CView”
(static 变量)
CRuntimeClass::pFirstClass
m_pBaseClass m_pBaseClass
m_pNextClass m_pNextClass
图3…1 CRuntimeClass 对象构成的类别型录网。本图只列出与RTTI 有关系
的成员。
为了实证整个类别型录网的存在,我在main 函数中调用PrintAllClasses ,把串行中的每
一个元素的类别名称、对象大小、以及schema no。 印出来:
void PrintAllClasses()
{
CRuntimeClass* pClass;
// just walk through the simple list of registered classes
for (pClass = CRuntimeClass::pFirstClass; pClass != NULL;
pClass = pClass…》m_pNextClass)
{
cout m_lpszClassName