日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MFC 单文档的全局变量

發布時間:2025/3/21 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MFC 单文档的全局变量 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

單文檔中每個view類中有自己的局部變量,所以在應用程序中定義全局變量要在這些View類啊,Doc類啊的外面。

待解決問題:希望對每處理一個文件,全局變量+1(如圖1所示,期望處理后結果為5,CVMFC1不算)


ok,問題實際上是MFC中如何設置和操作全局變量


首先我們講下最簡單的解決方案,后面在分析下MFC原理(*^__^*)?

======================================================================


最簡單的解決方案:

1. CXXXApp類(CXXX.h文件)中添加變量,即定義全局變量(也就是累加器)m_ins_num;一般其構造函數會自動賦0

2. 在定義處前面加上?public:?否則會被視為protected屬性

3. 在每個View類中調用,在處理函數(如打開函數)中現貨區CXXXApp類指針,然后將該屬性+1,這里還可以用Messagebox顯示數字(整型數)

[cpp]?view plain?copy
  • CCVMFCApp*?app=(CCVMFCApp*)?AfxGetApp();??
  • ????app->m_ins_num++;??
  • ????char?ss[25];??
  • ????sprintf(ss,"num=%d",app->m_ins_num);??
  • ????MessageBox(ss,"instance_num");??

  • ======================================================================

    下面講一下原理什么的

    我在編程的時候也經常遇到一些錯誤:

    gj.obj : error LNK2001: 無法解析的外部符號 "int gg" (?gg@@3HA)?
    gjDlg.obj : error LNK2001: 無法解析的外部符號 "public: static int CgjApp::g_gl" (?g_gl@CgjApp@@2HA)?
    Debug/gj.exe : fatal error LNK1120: 2 個無法解析的外部命令

    這些錯誤是由于對類中見的變量訪問造成的,要分清楚是類的靜態變量還是對象的成員變量,這很重要哦。

    用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不存在的問題。?

    總之,用沒有實例的類管理全局量是一個不錯的選擇,它具有集中管理,使用方便的好處。當然,除非特別必要,全局量還是少用為好,一個好的編程者決不會隨意濫用全局量的,一個封裝做得不好的程序,在修改維護時會讓你吃足苦頭。?


    from:?http://blog.csdn.net/abcjennifer/article/details/7477896

    總結

    以上是生活随笔為你收集整理的MFC 单文档的全局变量的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。