• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            The Coder

            I am a humble coder.

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              4 隨筆 :: 4 文章 :: 9 評論 :: 0 Trackbacks
            學(xué)習(xí)程序的好方法是閱讀代碼和改進(jìn)代碼。
            下面的程例來自《An Overview of the C++ Programming Language》(5.1 異常和錯誤處理)
            程序用途:使用C++的異常機(jī)制,報告stack的上溢或者下溢。(我適當(dāng)?shù)陌汛a補(bǔ)全。)

            version 1 演示了基本的異常用法。
            從try里拋出一個異常(實例或?qū)ο螅蒫atch里的類接受。

            ?1?version?1
            ?2?//?From:?An?Overview?of?the?C++?Programming?Language
            ?3??
            ?4?#include?<cstdlib>
            ?5?#include?<iostream>
            ?6?#include?<string>
            ?7?using?namespace?std;
            ?8?
            ?9?template<class?T>class?Stack{
            10?????T*?v;
            11?????int?max_size;
            12?????int?top;
            13?public:
            14?????class?Underflow{?};???//?下溢
            15?????class?Overflow{?};????//?上溢
            16?????//?construct?function.?determine?the?size???
            17?????Stack(int?s):?max_size(s),?top(0){?v?=?new?T[max_size];}??????
            18?????~Stack(){}
            19?????void?push(T?c){
            20?????????if(top?==?max_size)?throw?Overflow();
            21?????????v[top++]?=?c;
            22?????}
            23?????T?pop(){
            24?????????if(top?==?0)?throw?Underflow();
            25?????????return?v[--top];
            26?????}
            27?};?
            28?
            29?void?f()
            30?{
            31?????Stack<string>?ss(10);
            32?????try{
            33?????????ss.push("Quiz");
            34?????????string?s?=?ss.pop();
            35?????????ss.pop();
            36?????}
            37?????catch(Stack<string>::Overflow){
            38?????????cerr?<<?"error:?stack?overflow"?<<?endl;
            39?????}
            40?????catch(Stack<string>::Underflow){
            41?????????cerr?<<?"error:?stack?underflow"?<<?endl;
            42?????}
            43?}
            44?
            45?int?main(int?argc,?char?*argv[])
            46?{
            47?????f();
            48?????system("PAUSE");
            49?????return?EXIT_SUCCESS;
            50?}
            51?
            52?輸出結(jié)果:error:?stack?underflow
            53?
            54?


            改進(jìn),我們的第二個版本如下:
            如果將

            ?1??class?Underflow{?};???//?下溢
            ?2?????class?Overflow{?};????//?上溢
            ?3?
            ?4?????catch(Stack<string>::Overflow){
            ?5?????????cerr?<<?"error:?stack?overflow"?<<?endl;
            ?6?????}
            ?7?????catch(Stack<string>::Underflow){
            ?8?????????cerr?<<?"error:?stack?underflow"?<<?endl;
            ?9?????}
            10?


            分別改成如下:

            ?1?
            ?2?????class?Underflow{??????//
            ?3?????public:
            ?4?????????void?error(void){
            ?5?????????????cerr?<<?"stack?Underflow"?<<?endl;
            ?6?????????}????
            ?7?????};???
            ?8?????class?Overflow{???????//?
            ?9?????public:
            10?????????void?error(void){
            11?????????????cerr?<<?"stack?Overflow"?<<?endl;
            12?????????}?
            13?????};???
            14?
            15?????catch(Stack<string>::Overflow&?e){
            16?????????e.error();
            17?????}
            18?????catch(Stack<string>::Underflow&?e){
            19?????????e.error();
            20?????}
            21?

            改后的程序和原先的區(qū)別在哪里,看出來了嗎? 呵呵呵。

            當(dāng)然,我們還能將代碼改進(jìn)。這樣產(chǎn)生了第三個版本。

            第三個版本:version3
            在Stack里面添加一個類class Stack_error,讓Underflow和Overflow都繼承它:

            ?1?template<class?T>class?Stack{
            ?2?????//?????
            ?3?public:
            ?4?????class?stack_error{
            ?5?????public:
            ?6?????????virtual?void?error(void){  //當(dāng)然,可以把它做成純虛的。抽象類。
            ?7?????????????cerr?<<?"stack_error"?<<?endl;
            ?8?????????}
            ?9?????};
            10?????class?Underflow:?public?stack_error{??????//
            11?????public:
            12?????????void?error(void){
            13?????????????cerr?<<?"stack?Underflow"?<<?endl;
            14?????????}????
            15?????};???
            16?????class?Overflow:?public?stack_error{???????//?
            17?????public:
            18?????????void?error(void){
            19?????????????cerr?<<?"stack?Overflow"?<<?endl;
            20?????????}?
            21?????};???
            22?????//?
            23?}
            24?
            接著把兩個catch合并成一個catch,如下。
            ??try{
            ?????
            //?the?same
            ????}
            ????
            catch(Stack<string>::stack_error&?e){
            ????????e.error();
            ????}

            這三個版本的功能是一樣的,但版本越高,代碼越清晰,代碼也越容易維護(hù)。

            如果我們設(shè)計了一個庫(比如上面的Stack),在開始的時候想到的就是兩個異常,overflow和underflow。如果有version1和version3 這兩種方法設(shè)計Stack,那么函數(shù)f()(用戶的代碼)也同樣version1和version3。當(dāng)一段日子過去了,我們準(zhǔn)備再加入一個異常,比如midflow()(呵呵呵,我也想不出有什么類似的異常了)。這樣的話,庫設(shè)計者對用戶說:“我們發(fā)現(xiàn)了midflow()異常,并加入庫代碼中,請您改寫您的代碼f()。”
            這樣我們的version1得修改成如下形式:
            void?f()
            {
            ????Stack
            <string>?ss(10);
            ????
            try{
             ????
            //.
            ????}
            ????
            catch(Stack<string>::Overflow){
            ????????cerr?
            <<?"error:?stack?overflow"?<<?endl;
            ????}
            ????
            catch(Stack<string>::Underflow){
            ????????cerr?
            <<?"error:?stack?underflow"?<<?endl;
            ????}
            ????
            catch(Stack<string>::Midflow){????//我們的找到所有撲捉stack異常的代碼,并加入這兩句。
            ??????????cerr?<<?"error:?stack?midflow"?<<?endl;
            ????}
            }

            而version3由于midflow()繼承了stack_error。而其接口還是一樣,客戶代碼就無需更改了。

            ?完畢。鞠躬。 請多多交流!

            附:version3完整代碼:
            ?1?Version?3:
            ?2?#include?<cstdlib>
            ?3?#include?<iostream>
            ?4?
            ?5?using?namespace?std;
            ?6?
            ?7?template<class?T>class?Stack{
            ?8?????T*?v;
            ?9?????int?max_size;
            10?????int?top;
            11?public:
            12?????class?stack_error{
            13?????public:
            14?????????virtual?void?error(void)?=?0;
            15?????};
            16?
            17?????class?Underflow:?public?stack_error{??????//
            18?????public:
            19?????????void?error(void){
            20?????????????cerr?<<?"stack?Underflow"?<<?endl;
            21?????????}????
            22?????};???
            23?????class?Overflow:?public?stack_error{???????//?
            24?????public:
            25?????????void?error(void){
            26?????????????cerr?<<?"stack?Overflow"?<<?endl;
            27?????????}?
            28?????};???
            29?????Stack(int?s):?max_size(s),?top(0){?v?=?new?T[max_size];}????????//?construct?function.?determine?the?size???
            30?????~Stack(){}
            31?????void?push(T?c){
            32?????????if(top?==?max_size)?throw?Overflow();
            33?????????v[top++]?=?c;
            34?????}
            35?????T?pop(){
            36?????????if(top?==?0)?throw?Underflow();
            37?????????return?v[--top];
            38?????}
            39?};?
            40?
            41?void?f()
            42?{
            43?????Stack<string>?ss(0);
            44?????try{
            45?????????ss.push("Quiz");
            46?????????string?s?=?ss.pop();
            47?????????ss.pop();
            48?????}
            49?????catch(Stack<string>::stack_error&?e){
            50?????????e.error();
            51?????}
            52?
            53?}
            54?
            55?int?main(int?argc,?char?*argv[])
            56?{
            57?????f();
            58?????system("PAUSE");
            59?????return?EXIT_SUCCESS;
            60?}
            61?

            posted on 2006-05-31 10:29 TH 閱讀(704) 評論(0)  編輯 收藏 引用 所屬分類: C++語言特性和設(shè)計

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久综合狠狠综合久久综合88 | 久久精品无码一区二区三区| 久久久精品无码专区不卡| 久久发布国产伦子伦精品| 狠狠色综合网站久久久久久久高清| 久久综合五月丁香久久激情| 久久久久亚洲AV成人网人人软件| 久久精品国产99久久香蕉| 国内精品久久久久久麻豆| 久久99精品国产麻豆蜜芽| 欧美麻豆久久久久久中文| 一级女性全黄久久生活片免费 | 国内精品久久九九国产精品| 99国产精品久久| 2020最新久久久视精品爱| 91精品国产高清久久久久久91 | 久久精品国产亚洲麻豆| 青青热久久综合网伊人| 欧洲性大片xxxxx久久久| 久久国产色av免费看| 久久A级毛片免费观看| 99久久亚洲综合精品成人| 久久午夜综合久久| 日韩人妻无码精品久久久不卡| 久久电影网一区| 亚洲国产精品无码久久九九 | 久久99精品综合国产首页| 国内精品久久久久久麻豆| 欧美日韩精品久久免费| 久久精品草草草| 一级做a爰片久久毛片看看| 久久久久亚洲AV无码麻豆| 久久国产成人精品国产成人亚洲| 偷窥少妇久久久久久久久| 久久亚洲精品中文字幕三区| 久久久久久国产精品美女| 一级做a爰片久久毛片16| 中文字幕日本人妻久久久免费 | 国内精品久久久久影院一蜜桃| 久久性精品| 99久久精品无码一区二区毛片|