• <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
            <2011年4月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            1234567

            潛心看書研究!

            常用鏈接

            留言簿(19)

            隨筆分類(81)

            文章分類(89)

            相冊

            ACM OJ

            My friends

            搜索

            •  

            積分與排名

            • 積分 - 217765
            • 排名 - 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 閱讀(434) 評論(0)  編輯 收藏 引用 所屬分類: MFC
            精品国产91久久久久久久| 欧美黑人激情性久久| 丰满少妇高潮惨叫久久久| 青青草国产成人久久91网| 国产精品久久久久久久久久影院| 亚洲精品第一综合99久久| 国产精品久久自在自线观看| 狠狠色丁香久久婷婷综合_中| 国产精品99久久久精品无码| 精品久久久无码人妻中文字幕豆芽 | 久久久青草青青亚洲国产免观| 免费精品99久久国产综合精品| 伊人色综合久久天天| 国产∨亚洲V天堂无码久久久| 国产午夜电影久久| 伊人久久一区二区三区无码| 国产精品99久久久久久董美香| 欧洲性大片xxxxx久久久| 久久噜噜久久久精品66| 国产999精品久久久久久| 囯产极品美女高潮无套久久久| 国产精品久久久久久五月尺| 国产欧美一区二区久久| 97精品伊人久久久大香线蕉| 精品久久久无码中文字幕| 精品久久久久久无码专区不卡| 最新久久免费视频| 久久久久国产一级毛片高清板| 久久精品国产一区二区三区不卡| 亚洲国产精品无码久久SM| 国产精品9999久久久久| 久久午夜夜伦鲁鲁片免费无码影视| 国产农村妇女毛片精品久久| 国内精品伊人久久久久| 久久成人国产精品| 久久久久人妻精品一区三寸蜜桃| 日本一区精品久久久久影院| 久久国产精品一国产精品金尊| 99精品国产综合久久久久五月天| 久久精品极品盛宴观看| 亚洲中文精品久久久久久不卡|