類成員函式作為執行緒函式

2021-06-18 12:28:20 字數 1451 閱讀 7377

スクリーンをめんして、黙って、ぽかんと座っている

類成員函式作為執行緒函式  

2011-01-10 14:54:43|  分類: windows|字型大小 訂閱

-------------------類成員函式不能作為執行緒函式---------------------------

一般來說,c++的類成員函式不能作為執行緒函式。這是因為在類中定義的成員函式,編譯器會給其加

上this指標。請看下列程式:

#include "windows.h" 

#include

class exampletask   

;  void exampletask::taskmain(lpvoid param)

{}  

void exampletask::starttask()   

int main(int argc, char* argv) 

出現編譯錯誤:

error c3867: 'exampletask::taskmain': function call missing argument list; use '&exampletask::taskmain' to create a pointer to membe

下面code會出現與此同樣的編譯錯誤。

#include "windows.h" 

#include

class exampletask   

;  void exampletask::taskmain(lpvoid param)   

{}  

int main(int argc, char* argv) 

如果一定要以類成員函式作為執行緒函式,通常有如下解決方案:

(1)將該成員函式宣告為static型別,去掉this指標;

即將類定義改為:

#include "windows.h" 

#include

class exampletask   

;但是將成員函式宣告為靜態雖然可以解決作為執行緒函式的問題,但是它帶來了新的問題,那就是static成

員函式只能訪問static成員。解決此問題的一種途徑是可以在呼叫類靜態成員函式(執行緒函式)時將this

指標作為引數傳入,並在改執行緒函式中用強制型別轉換將this轉換成指向該類的指標,通過該指標訪問非

靜態成員。

(2)不定義類成員函式為執行緒函式,而將執行緒函式定義為類的友元函式。這樣,執行緒函式也可以有類

成員函式同等的許可權;  

我們將程式修改為:

#include "windows.h" 

#include

class exampletask   

;void taskmain(lpvoid param)   

void exampletask::starttask()   

int main(int argc, char* argv) 

類成員函式作為執行緒函式

include windows.h include class exampletask void exampletask taskmain lpvoid param void exampletask starttask int main int argc,char argv 出現編譯錯誤 error...

類成員作為執行緒入口函式

把類成員函式宣告為友元函式。函式實現在類外實現。一定要這樣。不然用其他奇葩少見的方法獲取類成員函式的位址,會造成不可預料的後果。執行緒入口函式的上下文引數傳入this指標,以便訪問類的proteted和private成員。以下是示例 1 定義控制台應用程式的入口點。23 include stdafx...

C 成員函式作為 執行緒函式

一般來說,用靜態函式是可以了.但是嘗試下用成員函式.呵呵.h檔案 cclientdlg 對話方塊 class cclientdlg public cdialog cpp檔案 beginthread 用,符合 cdecl call union proc beginthreadex 用,符合 stdca...