首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

MFC 專案中定義全域變數與全域函式的兩種最佳實踐

     編輯:關於C語言

MFC 專案由多個檔案組成,無法像傳統 C++ 程式隨意在類別外定義全域變數。本文介紹兩種在專案多檔案間共享資料與函式的標準方法。

方法一:於應用程式類別中定義(CWinApp 衍生類)

MFC 專案皆有一個 CWinApp 衍生類別(如 CMyApp),負責初始化、建立文件/視圖等。將需全域存取的變數與函式定義為該類別的成員,透過 AfxGetApp() 取得指標即可跨模組存取。

實作範例

// MyApp.h
class CMyApp : public CWinApp {
public:
    int g_nGlobalVar;           // 全域變數
    int GlobalFunc(int nParam); // 全域函式
    // ...
};

// MyApp.cpp
int CMyApp::GlobalFunc(int nParam) {
    return nParam + 1;
}

// 其他模組(如 View)存取
void CMyView::SomeFunction() {
    CMyApp* pApp = (CMyApp*)AfxGetApp();
    pApp->g_nGlobalVar = 100;
    int nResult = pApp->GlobalFunc(5);
}

優缺點分析

  • 優點:簡單直觀,無需額外檔案。
  • 缺點:存取需轉型指標、語法冗長;與應用程式核心邏輯無關的資料混入 CWinApp 破壞封裝性。

方法二:靜態類別封裝(推薦)

建立無實例的靜態類別(如 CGlobal),所有成員宣告為 static,以 類別名::成員名 直接存取,語法簡潔近似 API 呼叫。

實作步驟

  1. 新增類別:選擇「Generic Class」,命名為 CGlobal。
  2. 包含頭檔:於 CWinApp 衍生類別頭檔(如 MyApp.h)#include "Global.h",其他模組自動可見。
  3. 定義靜態成員:
    // Global.h
    class CGlobal {
    public:
        static int g_nValue;
        static int g_nTime;
        static int GlobalFunc(int nParam);
    };
    
    // Global.cpp
    int CGlobal::g_nValue = 0;  // 必須在類別外定義並初始化
    int CGlobal::g_nTime;       // 未初始化也必須定義
    
    int CGlobal::GlobalFunc(int nParam) { // 實作時不加 static
        return nParam + 1;
    }
  4. 跨模組存取:
    void CMyView::SomeFunction() {
        CGlobal::g_nValue = 100;
        CGlobal::g_nTime = CGlobal::GlobalFunc(5);
    }

關鍵注意事項

  • 靜態成員獨立於類別實例存在,無需建構物件。
  • 靜態資料成員必須在類別外定義(含初始化),否則連結錯誤。
  • 若靜態函式需存取類別內變數,該變數必須也為 static。
  • 建構/解構函式不會被呼叫,勿在其中放置邏輯。

總結建議

靜態類別封裝法具備集中管理、存取簡潔、不破壞既有類別封裝三大優勢,為 MFC 專案跨模組共享資料的推薦做法。但全域資料仍應審慎使用,過度依賴會增加維護困難度。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved