程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 談static在MFC中的運用

談static在MFC中的運用

編輯:關於VC++

學習《深入淺出MFC》有一段時間了,有一些想法就記了下來,希望與大家共勉

我們知道,C++中的static數據成員表示基於該類創建的所有對象共享該static數據成員的一份拷貝。基於這個原則,可以實現多種技術,比如說為某類創建一個計數器,用來記錄任意時刻共創建了多少個此類的對象。

class test{
public:
  test(){count++;}
  static int count;
};
test::count=0;
void main(){
cout<<test::count;
test t1;
cout<<test::count;
test t2,t3;
cout<<test::count;
}

雖然用全局變量也可達到目的,但是會帶來名字污染及其他一些問題,其中一些會牽涉到面向對象的觀念。

在MFC中,static更是得到了廣泛的運用。侯捷在著作《深入淺出MFC》中剖析MFC的原理和和各種技術如動態創建、運行時類型識別、消息映射、命令傳遞等,均和static密不可分。下面以其中之一的“消息映射”為例來討論static的運用

關於static,一個重要的觀念就是:static成員變量並不是因為對象的實現才得以實現,它本來就存在,你可以想象它是一個全局變量。(見《深入淺出MFC》P71頁)。所以,我們來看DECLARE_MESSAGE_MAP這個宏定義:

#define DECLARE_MESSAGE_MAP()\
static AFX_MSGMAP_ENTRY _messageEntries[];\
static AFX_MSGMAP messageMap;\
virtual AFX_MSGMAP *GetMessageMap() const;

如果我們定義一個派生自類CFrameWnd的類CMyWnd並在其中用上了DECLARE_MESSAGE_MAP宏

//在MyApp.h頭文件中
class CMyWnd:public CFrameWnd{
public:
……
DECLARE_MESSAGE_MAP();
……
};

實則為該類聲明了兩個static數據成員(以及一個虛擬函數),接著下來的BEGIN_MESSAGE_MAP宏

//在MyApp.cpp文件中
BEGIN_MESSAGE_MAP(CMyWnd,CFrameWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()

實則是定義了CMyWnd::messageMap和CMyWnd::_messageEntries這兩個變量並給予它們適當的初值。此時,盡管還沒有產生出一個CMyWnd對象,這兩個變量也得以存在。實際上,在進入AfxWinMain函數(由MFC提供)之前,不光是這兩個變量存在,其它的與MFC的一些重要的類所相關的一些變量,如CWinApp::messageMap和

CWinApp::messageEntries、CWnd::messageMap和CWnd::messageEntries等均已存在,它們構成了一張消息傳遞網,為以後的消息在類之間流動提供了一個重要的基礎。當然,這會占用一部分內存。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved