友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
狗狗书籍 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

深入浅出MFC第2版(PDF格式)-第55章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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 宏 
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!