避免因在類中使用靜態函式而大量使用靜態變數 (轉)
拿來最常見的例子:執行緒。
執行緒函式要麼是全域性函式,要是是類裡的靜態函式。
作為全域性函式的時候破壞了類的封裝
而作為類的靜態函式的話,又必須把靜態函式中用到的成員變數、函式都改為靜態、、、
總的來說就是-----用之不爽!
有什麼辦法既不破壞類的封裝又不因為靜態函式使用大量靜態變數和靜態函式呢?
答案:使含有靜態函式的類的例項作為全域性變數出現(其實這樣做還是用全域性、、什麼道理我也講不清,管它呢~)
舉個例子吧,我要在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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 靜態變數變數
- 類內的靜態成員函式函式
- C++靜態函式C++函式
- 【C++】靜態持續變數?如何建立靜態持續變數?C++變數
- Java靜態變數在靜態方法內部無法改變值Java變數
- 區域性變數和全域性變數(靜態和非靜態)區別變數
- Solidity中函式返回值,靜態動態陣列Solid函式陣列
- 如何使用 Serverless Devs 部署靜態網站到函式計算Serverdev網站函式
- ES6中類的靜態方法=> static 的使用
- linux 動態庫 靜態庫 函式覆蓋Linux函式
- ConcurrentHashMap(一):常量,成員變數,靜態程式碼塊,內部類,spread函式,tabAt函式等詳解HashMap變數函式BAT
- static靜態方法的使用
- 討論篇:靜態變數生命週期到底何如?如何使用?變數
- 例項 靜態 類
- url_for函式與靜態檔案函式
- 從零玩轉jQuery-核心函式和靜態方法jQuery函式
- C++建構函式和解構函式呼叫虛擬函式時使用靜態聯編C++函式
- C++類的靜態成員變數初始化C++變數
- 16 ##### 適合靜態方法的場景:方法中不使用物件的值,則直接使用靜態方法物件
- java靜態方法使用泛型Java泛型
- 使用 Hexo 搭建靜態部落格Hexo
- Spring如何為靜態變數注入值Spring變數
- 靜態域與靜態方法
- C++學習筆記(三):類與物件--靜態成員變數與常成員函式C++筆記物件變數函式
- DEDE整站動態/靜態轉換
- QT之靜態函式傳送訊號QT函式
- C靜態庫的建立與使用--為什麼要引入靜態庫?
- TypeScript 類靜態屬性TypeScript
- 靜態內部類 呼叫
- 14 #### 方法分類與使用場景(繫結、靜態、類方法)
- 對於systemverilog靜態變數和動態變數 ,描述不正確的是()。變數
- CE的使用及靜態地址與動態地址
- C語言--靜態區域性變數C語言變數
- Java逆向基礎之靜態變數存取Java變數
- Java自學入門之靜態變數Java變數
- HttpCanary使用指南——靜態注入器HTTPPCA
- 使用靜態html繪製流程圖HTML流程圖
- Promise 靜態 API 的使用方法PromiseAPI
- 靜態