MFC 專案由多個檔案組成,無法像傳統 C++ 程式隨意在類別外定義全域變數。本文介紹兩種在專案多檔案間共享資料與函式的標準方法。
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);
}
建立無實例的靜態類別(如 CGlobal),所有成員宣告為 static,以 類別名::成員名 直接存取,語法簡潔近似 API 呼叫。
CGlobal。MyApp.h)#include "Global.h",其他模組自動可見。// 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;
}
void CMyView::SomeFunction() {
CGlobal::g_nValue = 100;
CGlobal::g_nTime = CGlobal::GlobalFunc(5);
}
靜態類別封裝法具備集中管理、存取簡潔、不破壞既有類別封裝三大優勢,為 MFC 專案跨模組共享資料的推薦做法。但全域資料仍應審慎使用,過度依賴會增加維護困難度。