避免因在類中使用靜態函式而大量使用靜態變數 (轉)

worldblog發表於2007-12-09
避免因在類中使用靜態函式而大量使用靜態變數 (轉)[@more@]

拿來最常見的例子:執行緒。

執行緒函式要麼是全域性函式,要是是類裡的靜態函式。

作為全域性函式的時候破壞了類的封裝

而作為類的靜態函式的話,又必須把靜態函式中用到的成員變數、函式都改為靜態、、、

總的來說就是-----用之不爽!

有什麼辦法既不破壞類的封裝又不因為靜態函式使用大量靜態變數和靜態函式呢?

答案:使含有靜態函式的類的例項作為全域性變數出現(其實這樣做還是用全域性、、什麼道理我也講不清,管它呢~)

舉個例子吧,我要在CMainFrame里加一個ThreadProc執行緒函式,

這樣宣告

static UINT ThreadProc(LPVOID pParam);//跟平常一樣

這時在ThreadProc裡CMainFrame裡的非靜態函式變數就不行了

比如:UINT CMainFrame::ThreadProc(LPVOID pParam)

  {

  this->m_szMember =  pParam ; /*裡會出錯,說m_szMember不是靜態變數不能呼叫,你將不得不把m_szMember設定為靜態*/

  return TRUE;

  }

把CMainFrame設定為全域性變數就不必了

比如,在xxxxapp.cpp中加入:

CMainFrame* pMainFrame;

在xxxxapp.h里加入extern CMainFrame* pMainFrame;

這樣,你的ThreadProc可以這樣寫:

  UINT CMainFrame::ThreadProc(LPVOID pParam)

  {

  pMainFrame->m_szMember =  pParam ; /*m_szMember可以不是static形式了*/

  return TRUE;

  }

 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-989996/,如需轉載,請註明出處,否則將追究法律責任。

相關文章