• <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>
            隨筆 - 87  文章 - 279  trackbacks - 0
            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            潛心看書研究!

            常用鏈接

            留言簿(19)

            隨筆分類(81)

            文章分類(89)

            相冊

            ACM OJ

            My friends

            搜索

            •  

            積分與排名

            • 積分 - 216441
            • 排名 - 117

            最新評論

            閱讀排行榜

            評論排行榜

            來自:http://zhidao.baidu.com/question/4090232.html

            用MFC制作的工程由很多文件構成,它不能象一般C++程序那樣隨意在類外定義全局變量,在這里要想定義能被工程內多個文件共享的全局變量和函數必須用一些特殊方法才行。實際上有多種方法可以實現,這里只介紹兩種方法。

            一、在應用程序類中定義

            用MFC生成的工程中都有一個名為CxxxApp的類,它派生于CWinApp類。這個類主要進行程序的初始化,生成文檔、視圖對象等工作。我們可以把需要全局訪問的變量和函數定義為這個類的成員變量和成員函數,就可以實現全局訪問了。

            從嚴格意義上講,這種變量和函數并不是全局的,因為它仍然只是類中的成員,只是由于我們很容易獲得CxxxApp類的指針,所以我們可以在文檔、視圖、對話框以及各種自定義類中訪問到它們,達到與全局變量類似的效果。訪問時用函數“AfxGetApp()”獲得CxxxApp類的指針,用“AfxGetApp()->成員”訪問變量或函數。

            例:

            Test.h:(應用程序類頭文件)

            class CTestApp : public CWinApp
            {
            public:
            int x; //全局變量
            int f(int y); //全局函數
            …………
            };

            Test.cpp:(應用程序類程序文件)

            int CTestApp::f(int y) //全局函數定義
            {
            y++;
            return y;
            }

            定義在CTestApp類中的變量和函數可以在其它類中被訪問。比如在視圖的某函數中要訪問變量x和函數f():

            void CTestView::xyz()
            {
            CTestApp *app = (CTestApp *)AfxGetApp(); //生成指向應用程序類的指針
            app->x = 0; //訪問變量x
            int z = app->f(1); //訪問函數f()
            …………
            }

            這樣,變量x和函數f()可以視作為全局的。

            用這種方法實現的全局變量和全局函數雖比較簡單,但也有缺點,一是訪問不太方便,每次都需要獲取應用程序類的指針;再就是把一些與應用程序類本身無關的變量和函數放在里面,使這個類看上去怪怪的,破壞了類的封裝。

            二、用靜態變量和靜態函數實現

            很喜歡API函數的那種調用方法,不論在哪個類中只要用“::API函數”就可以調用了。合理利用靜態類型(static)可以實現與此相似的全局變量和全局函數。

            靜態變量和靜態函數有如下性質:

            若在一個類中用關鍵字static聲明數據成員,則這個數據成員就只存在一個拷貝,無論該類創建了多少個實例,它始終只存在一個,即使該類的實例一個也沒創建,它也存在。

            若在一個類中用關鍵字static聲明函數,該函數可以用“類名::函數名”方式訪問,無需引用該類的實例,甚至這個類的實例可以不存在。

            利用這個性質實現的全局變量和函數使用起來很方便。

            值得注意的是,全局變量和全局函數最好集中封裝,不要在文檔、視圖等類內部定義,這樣用起來才有全局的感覺。

            例:

            1、添加一個沒有基類的新類,設類名起為CPublic,姑且稱之為公用類

            單擊“Insert”菜單下的“New Class”命令,選擇“Class type”為“Generic Class”,在“Name”欄中填入類名“CPublic”,單擊“OK”,則新類建立完畢。

            2、包含公用類的頭文件,使各個類都能訪問它

            CPublic的頭文件應包含在應用程序類的頭文件中,這樣在其它類中引用CPublic類時就不需要再包含了。

            Test.h:(應用程序類頭文件)

            #include "Public.h" //包含公用類頭文件

            class CTestApp : public CWinApp
            {
            …………
            };

            3、在公用類中定義全局變量和全局函數,均使用static修飾,靜態變量還必須在類外定義和初始化

            Public.h:(公用類頭文件)

            class CPublic
            {
            public:
            CPublic();
            virtual ~CPublic();

            public:
            static int x; //全局變量
            static int time; //全局變量
            static int f(int y); //全局函數
            …………
            }

            在公用類中對靜態變量進行初始化和定義函數體:

            Public.cpp:(公用類程序文件)

            int CPublic::x = 0; //初始化全局變量
            int CPublic::time; //定義全局變量

            CPublic::CPublic()
            {

            }

            CPublic::~CPublic()
            {

            }

            int CPublic::f(int y) //全局函數,這里不要再加static
            {
            y++;
            return y;
            }

            4、全局量的使用

            使用變量:CPublic::變量名

            使用函數:CPublic::函數()

            如在視圖的某函數中訪問變量x和函數f():

            void CTestView::xyz()
            {
            CPublic::x = 0; //訪問變量x
            CPublic::time = CPublic::f(1); //訪問函數f()
            …………
            }

            在其它類中訪問x、time和f()的方法與此相同。

            5、幾點注意:

            ① 由于靜態量可獨立于類存在,不需要生成CPublic類的實例。

            ② 靜態數據成員的定義和初始化必須在類外進行,如例中x的初始化;變量time雖然沒有初始化,但也必須在類外進行定義。由于沒有生成CPublic類的實例,所以它的構造函數和析構函數都不會被執行,在里面做什么工作都沒有什么意義。

            ③ 如果靜態函數需要訪問CPublic類內的變量,這些變量也必須為靜態的。因為非靜態量在不生成實例時都不會存在。 如:

            class CPublic
            {
            public:
            int x; //內部變量
            static int f(int y) //全局函數
            {
            x++;
            return x;
            };
            …………
            };

            這里x雖為類內成員,但如果不生成CPublic類的實例,就會出現函數f()存在,而變量x不存在的問題。

            總之,用沒有實例的類管理全局量是一個不錯的選擇,它具有集中管理,使用方便的好處。當然,除非特別必要,全局量還是少用為好,一個好的編程者決不會隨意濫用全局量的,一個封裝做得不好的程序,在修改維護時會讓你吃足苦頭。
            posted on 2007-09-27 11:39 閱讀(424) 評論(0)  編輯 收藏 引用 所屬分類: MFC
            91精品国产91久久久久久蜜臀| 热99RE久久精品这里都是精品免费| 九九久久精品国产| 狠狠色伊人久久精品综合网 | 精品水蜜桃久久久久久久| 久久精品国产99久久无毒不卡| 精品久久久久久中文字幕人妻最新| 99久久成人国产精品免费| 97久久精品人人做人人爽| 99精品久久久久久久婷婷| 国产激情久久久久影院| 香蕉久久夜色精品升级完成| 伊人色综合久久| 久久精品国产99久久香蕉| 久久精品99久久香蕉国产色戒| 色婷婷久久综合中文久久蜜桃av| 国产成人久久精品麻豆一区| 久久伊人精品青青草原高清| 久久亚洲AV成人无码软件| 久久精品一区二区三区AV| 久久精品无码专区免费 | 久久久久久亚洲精品成人| 欧洲精品久久久av无码电影| 99久久婷婷免费国产综合精品| 午夜不卡888久久| 亚洲国产精品成人久久蜜臀| 久久精品国产亚洲欧美| 人妻无码αv中文字幕久久琪琪布| 久久精品无码一区二区无码| 99久久精品免费看国产一区二区三区 | 亚洲国产成人久久综合碰碰动漫3d| 伊人久久综在合线亚洲2019| 亚洲伊人久久成综合人影院 | 久久亚洲国产欧洲精品一| 久久九九久精品国产免费直播| 久久婷婷五月综合97色直播| 国产精品久久成人影院| 久久久亚洲精品蜜桃臀| 久久99国产一区二区三区| 久久久久久久久久久| 国产精品亚洲美女久久久|