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

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

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




     private: 

             。 。。 

     }; 



    虽然Visual C++ 编译器自从4。0 版已经支持RTTI ,但MFC 4。x 并未使用编译器的能力 

    完成其对RTTI  的支持。MFC 有自己一套沿用已久的办法(从1。0 版就开始了)。喔, 

    不要因为MFC  的作法特殊而非难它,想想看它的悠久历史。 



    MFC  的RTTI 能力牵扯到一组非常神秘的宏( DE CLARE_D YNAMIC  、 

    IMPLEMENT  D YNAMIC                     CRuntimeClass 

              _                                           MFC  

                       )和一个非常神秘的类别(                    )。     程序员都知 

    道怎么用它,却没几个人懂得其运作原理。大道不过三两行,说穿不值一文钱,下一章 

    我就仿真出一个RTTI  的DOS 版本给你看。 



                Dynamic Creation) 

动态生成 ( 



    对象导向术语中有一个名为persistence,意思是永续存留。放在RAM  中的东西,生命 

    受到电力的左右,不可能永续存留;唯一的办法是把它写到文件去。MFC  的一个术语 

    Serialize,就是做有关文件读写的永续存留动作,并且实做作出一个虚拟函数,就叫作 

    Serialize 。 



    看起来永续存留与本节的主题「动态生成」似乎没有什么干连。有!你把你的资料储存 

    到文件,这些资料很可能(通常是)对象中的成员变量 我把它读出来后,势必要依据 

    文件上的记载,重新new  出那些个对象来。问题在于,即使我的程序有那些类别定义(就 

    算我的程序和你的程序有一样的内容好了),我能够这么做吗: 



      char className'30' = getClassName(); // 从文件(或使用者输入)获得一个类别名称 

      CObject* obj = new classname; // 这一行行不通 



                                                                              95 


…………………………………………………………Page 158……………………………………………………………

                 首先,new classname 这个动作就过不了关。其次,就算过得了关,new  出来的对象究 

                 竟该是什么类别类型?虽然以一个指向MFC 类别老祖宗(CObject )的对象指针来容纳 

                 它绝对没有问题,但终不好总是如此吧!不见得这样子就能够满足你的程序需求啊。 

                 显然,你能够以Serialize  函数写档,我能够以Serialize  函数读档,但我就是没办法恢复 

                           … 

                 你原来的状态  除非我的程序能够「动态生成」。 



                                                        DE CLARE  D YNCREA TE  

                 MFC 支持动态生成, 靠的是一组非常神秘的宏(                      _           、 

                 IMPLEMENT  D YNCREA TE                   CRuntimeClass 

                           _ 

                                      )和一个非常神秘的类别(                   )。第3章中我将 

                 把它抽丝剥茧,以一个DOS 程序仿真出来。 



                           Exception Handling) 

           异常处理 ( 



                 Exception                      C++  

                         (异常情况)是一个颇为新鲜的             语言特征,可以帮助你管理执行时期的错 

                                           nested                  Wat C++  

                 误,特别是那些发生在深度巢状(                )函数调用之中的错误。                  是最早支 

                 持ANSI C++ 异常情况的编译器,Borland C++ 4。0 随后跟进,然后是Microsoft Visual 

                 C++ 和Symantec C++ 。现在,这已成为C++ 编译器必需支持的项目。 



                 C++  exception       C  setj mp  longjmp  

                     的       基本上是与      的      和       函数对等的东西,但它增加了一 

                 些功能,以处理C++ 程序的特别需求。从深度巢状的例程调用中直接以一条快捷方式撤回 

                 到异常情况处理例程(exception handler ),这种「错误管理方式」远比结构化程序中经 

                 过层层的例程传回一系列的错误状态来的好。事实上exception handling 是MFC 和 

                 OWL 两个application frameworks  的防弹中心。 



                   C++ 导入了三个新的exception 保留字: 



                     1。 try 。之后跟随一段以{  }  圈出来的程序代码,exception 可能在其中发生。 

                     2。 catch 。之后跟随一段以{  }  圈出来的程序代码,那是exception 处理例程之所在。 

                      catch 应该紧跟在try 之后。 

                     3。 throw 。这是一个指令,用来产生(抛出)一个exception 。 



96 


…………………………………………………………Page 159……………………………………………………………

                                                       第2章  C++ 的重要性伲�



 下面是个实例  : 



    try { 

          // try block。 

    } 

    catch (char *p) { 

          printf(〃Caught a char* exception; value %sn〃;p); 

    } 

    catch (double d) { 

          printf(〃Caught a numeric exception; value %gn〃;d); 

    } 

    catch (。。。) {  // catch anything 

          printf(〃Caught an unknown exceptionn〃); 

    } 



MFC 早就支持exception,不过早期它用的是非标准语法。Visual C++ 4。0 编译器本身支 



持完整的C++ exceptions,MFC 也因此有了两个exception 版本:你可以使用语言本身 



提供的性能,也可以沿用MFC 古老的方法(以宏形式出现)。人们曾经因为MFC  的 



方案不同于ANSI 标准而非难它,但是不要忘记它已经运作了多少年。 



MFC  的exceptions 机制是以宏和exception types 为基础。这些宏类似C++  的 



exception 保留字,动作也满像。MFC  以下列宏仿真C++ exception handling: 



    TRY 

    CATCH(type;object) 

    AND_CATCH(type;object) 

    END_CATCH 

    CATCH_ALL(object) 

    AND_CATCH_ALL(object) 

    END_CATCH_ALL 

    END_TRY 

    THROW() 

    THROW_LAST() 



MFC 所使用的语法与日渐浮现的标准稍微不同,不过其间差异微不足道。为了以MFC 



捕捉exceptions,你应该建立一个TRY  区块,下面接着CATCH  区块: 



    TRY { 

          // try block。 

    } 

    CATCH (CMemoryException; e) { 



                                                                                      97 


…………………………………………………………Page 160……………………………………………………………

                    第篇  勿在浮砂築高台 



                              printf(〃Caught a memory exception。n〃); 

                         } 

                        AND_CATCH_ALL (e) { 

                              printf(〃Caught an exception。n〃); 

                         } 

                        END_CATCH_ALL 



                    THROW 宏相当于C++ 语言中的thro
返回目录 上一页 下一页 回到顶部 赞(1) 踩(1)
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!