避免因在類中使用靜態函式而大量使用靜態變數 (轉)
拿來最常見的例子:執行緒。
執行緒函式要麼是全域性函式,要是是類裡的靜態函式。
作為全域性函式的時候破壞了類的封裝
而作為類的靜態函式的話,又必須把靜態函式中用到的成員變數、函式都改為靜態、、、
總的來說就是-----用之不爽!
有什麼辦法既不破壞類的封裝又不因為靜態函式使用大量靜態變數和靜態函式呢?
答案:使含有靜態函式的類的例項作為全域性變數出現(其實這樣做還是用全域性、、什麼道理我也講不清,管它呢~)
舉個例子吧,我要在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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 函式的靜態變數 static函式變數
- C#靜態建構函式及靜態變數學習C#函式變數
- 靜態變數和非靜態變數變數
- 靜態變數與靜態方法變數
- PHP類的靜態(static)方法和靜態(static)變數PHP變數
- Java靜態變數塊使用案例Java變數
- java靜態變數和靜態函式是否可以被繼承,重寫!Java變數函式繼承
- 類中靜態回撥函式應用函式
- asp.net中使用靜態變數ASP.NET變數
- js中的靜態變數JS變數
- 類內的靜態成員函式函式
- VBA靜態變數與常量(轉)變數
- 【C++】靜態持續變數?如何建立靜態持續變數?C++變數
- 靜態持續變數變數
- 靜態變數和Session變數Session
- 靜態資料成員和靜態成員函式函式
- 遞迴程式中的靜態變數遞迴變數
- 區域性變數和全域性變數(靜態和非靜態)區別變數
- static靜態變數的理解變數
- 繫結變數在靜態sql和動態sql中變數SQL
- DELPHI中的靜態虛擬及動態方法函式的區別。 (轉)函式
- C語言區域性變數、全域性變數、靜態區域性變數、靜態全域性變數C語言變數
- 父類與子類之間靜態函式的呼叫以及函式引數的傳遞函式
- Jni函式的靜態繫結函式
- 獨一無二----靜態成員變數 (轉)變數
- C/C++ 靜態變數解析C++變數
- PHP的靜態變數介紹PHP變數
- 靜態內部類和非靜態內部類區別
- Delphi 類的靜態屬性 (轉)
- 靜態全域性變數和全域性變數變數
- 靜態變數和例項變數區別?變數
- 如何使用 Serverless Devs 部署靜態網站到函式計算Serverdev網站函式
- C# 靜態類C#
- 討論篇:靜態變數生命週期到底何如?如何使用?變數
- .NET偽靜態使用以及和純靜態的區別
- C++類的靜態成員變數初始化C++變數
- 動態引數,靜態引數
- linux 動態庫 靜態庫 函式覆蓋Linux函式