• <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ī)制,報(bào)告stack的上溢或者下溢。(我適當(dāng)?shù)陌汛a補(bǔ)全。)

            version 1 演示了基本的異常用法。
            從try里拋出一個異常(實(shí)例或?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è)計(jì)了一個庫(比如上面的Stack),在開始的時候想到的就是兩個異常,overflow和underflow。如果有version1和version3 這兩種方法設(shè)計(jì)Stack,那么函數(shù)f()(用戶的代碼)也同樣version1和version3。當(dāng)一段日子過去了,我們準(zhǔn)備再加入一個異常,比如midflow()(呵呵呵,我也想不出有什么類似的異常了)。這樣的話,庫設(shè)計(jì)者對用戶說:“我們發(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 閱讀(703) 評論(0)  編輯 收藏 引用 所屬分類: C++語言特性和設(shè)計(jì)

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


            亚洲国产日韩欧美综合久久| 久久99热这里只有精品国产| 色偷偷久久一区二区三区| 欧美日韩精品久久久久| 国产真实乱对白精彩久久| 久久精品国产99国产精品澳门| 国产Av激情久久无码天堂| 无码人妻久久一区二区三区免费 | 99久久精品国内| 久久精品蜜芽亚洲国产AV| 国产精品久久久久国产A级| 久久中文骚妇内射| 久久婷婷久久一区二区三区| 亚洲一本综合久久| 久久精品无码一区二区日韩AV| 久久免费视频6| 久久综合亚洲色HEZYO社区 | 99久久中文字幕| 精品无码久久久久久久动漫| 久久精品国产亚洲av瑜伽| 热久久国产欧美一区二区精品| 久久亚洲sm情趣捆绑调教| 新狼窝色AV性久久久久久| 国内精品久久久久影院优| 激情久久久久久久久久| 亚洲v国产v天堂a无码久久| 77777亚洲午夜久久多人| 精品久久久噜噜噜久久久 | 久久一日本道色综合久久| 色妞色综合久久夜夜| 色综合久久天天综合| 伊人久久亚洲综合影院| 国产精品久久波多野结衣| 久久精品免费网站网| 久久亚洲精品人成综合网| 久久久久久国产精品无码下载| 色播久久人人爽人人爽人人片AV| 久久精品成人免费网站| 精品综合久久久久久97| 国产免费久久精品丫丫| 久久超碰97人人做人人爱|