按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
#0019 // main
#0020 //……………………………………………………………………………………………………………………………………………………………………
#0021 void main()
#0022 {
#0023
#0024 CWinApp* pApp = AfxGetApp();
#0025
#0026 pApp…》InitApplication();
#0027 pApp…》InitInstance();
#0028 pApp…》Run();
#0029 }
RTTI (执行时期型别辨识)
你已经在第2章看到,Visual C++ 4。0 支持RTTI,重点不外乎是:
1。 编译时需选用/GR 选项(/GR 的意思是enable C++ RTTI
)
2。 包含typeinfo。h
3。 使用新的typeid 运算子。
RTTI 亦有称为Runtime Type Identification 者。
MFC 早在编译器支持RTTI 之前,就有了这项能力。我们现在要以相同的手法,在DOS
程序中仿真出来。我希望我的类别库具备IsKindOf 的能力,能在执行时期侦测某个对象
是否「属于某种类别」,并传回TRUE 或FALSE 。以前一章的Shape 为例,我希望:
CSquare* pSquare = new CSquare;
cout IsKindOf(CSquare); // 应该获得1 (TRUE)
cout IsKindOf(CRect); // 应该获得1 (TRUE)
cout IsKindOf(CShape); // 应该获得1 (TRUE)
122
…………………………………………………………Page 185……………………………………………………………
cout IsKindOf(CCircle); // 应该获得0 (FALSE)
以MFC 的类别阶层来说,我希望:
注意:真正的IsKindOf 参数其实没能那么单纯
CMyDoc* pMyDoc = new CMyDoc;
cout IsKindOf(CMyDoc); // 应该获得1 (TRUE)
cout IsKindOf(CDocument); // 应该获得1 (TRUE)
cout IsKindOf(CCmdTarget); // 应该获得1 (TRUE)
cout IsKindOf(CWnd); // 应该获得0 (FALSE)
类别型录网与CRuntimeClass
怎么设计RTTI 呢?让我们想想,当你手上握有一种色泽,想知道它的RGB 成份比,
不查色表行吗?当你持有一种产品,想知道它的型号,不查型录行吗?要达到RTTI 的
能力,我们(类别库的设计者)一定要在类别构造起来的时候,记录必要的信息,以建
立型录。型录中的类别信息,最好以串行(linked list )方式串接起来,将来方便一一比
对。
我们这份「类别型录」的串行元素将以CRuntimeClass 描述之,那是一个结构,内中至
少需有类别名称、串行的Next 指针,以及串行的First 指针。由于First 指针属于全域
变量,一份就好,所以它应该以static 修饰之。除此之外你所看到的其它CRuntimeClass
成员都是为了其它目的而准备,陆陆续续我会介绍出来。
// in MFC。H
struct CRuntimeClass
{
// Attributes
LPCSTR m_lpszClassName;
int m_nObjectSize;
UINT m_wSchema; // schema number of the loaded class
CObject* (PASCAL* m_pfnCreateObject)(); // NULL =》 abstract class
CRuntimeClass* m_pBaseClass;
// CRuntimeClass objects linked together in simple list
static CRuntimeClass* pFirstClass; // start of class list
CRuntimeClass* m_pNextClass; // linked list of registered classes
};
123
…………………………………………………………Page 186……………………………………………………………
第篇 勿在浮砂築高台
CRuntimeClass 对象内容
m_lpszClassName
m_nObjectSize
m_wSchema
CRuntimeClass::pFirstClass m_pfnCreateObject
(static 变量)
m_pBaseClass
m_pNextClass
我希望,每一个类别都能拥有这样一个CRuntimeClass 成员变量,并且最好有一定的命名
规则(例如在类别名称之前冠以〃class〃 作为它的名称),然后,经由某种手段将整个
类别库构造好之后,「类别型录」能呈现类似这样的风貌:
CObject::classCObject CCmdTarget::classCCmdTarget CWinThread::classCWinThread
“CObject” “CCmdTarget” “CWinThread”
m_pBaseClass m_pBaseClass m_pBaseClass
m_pNextClass m_pNextClass m_pNextClass
NULL NULL CObject::classCObject CCmdTarget::classCCmdTarget
CWnd::classCWnd CWinApp::classCWinApp
“CWnd” “CWinApp”
static 变量
CRuntimeClass::pFirstClass
m_pBaseClass m_pBaseClass
m_pNextClass m_pNextClass
CCmdTarget::classCCmdTarget CWinThread::classCWinThread
124
…………………………………………………………Page 187……………………………………………………………
第3章 MFC 六大關鍵技術之模擬
DECLARE_DYNAMIC / IMPLEMENT_DYNAMIC 宏