用靜態成員函式呼叫非靜態成員變數

2022-09-02 06:30:15 字數 1150 閱讀 7570

今天寫程式要用到乙個計時器,然後需要建立乙個新的執行緒,這個執行緒是ctestdlg的乙個成員函式,必須定義為靜態的.但是這個時候就不能去訪問非靜態成員變數了,這裡找到乙個很好的解決辦法:

先上**:

1.執行緒函式的定義:

private

:

intcount_time;

ctime c_time;

bool

getquestion();

int mark;//

考試分值,五個題目,乙個20分,滿分100

int qs[5];//

隨機題庫序號

int count2;//

題庫總數

int count_q;//

當前輸出的題目數量

static

dword winapi fun_time(lpvoid lpparameter);

};

我們可以看到這個是乙個類的成員函式

2.建立執行緒

void

ctestdlg::ontime()

這個是在乙個訊息函式中建立的.第四個引數傳遞的是乙個this指標,指向當前的視窗類(這裡很重要)

2.具體實現

dword winapi ctestdlg::fun_time(lpvoid lpparameter)

return0;

}

這裡我們可以看到,視窗控制代碼傳遞過來,然後通過強制型別轉換,將它複製給乙個新的臨時變數,然後用這個臨時的指標就可以去訪問類的成員了.很好的乙個解決辦法!!

思想的總結如下:

建立執行緒時,執行緒函式如果要設定成類的成員函式,則必須是靜態成員函式,在此函式種不能使用非靜態成員變數,如果要使用非靜態成員變數,則一種比較適合執行緒的方法是:建立執行緒的時候把this作為createthread的乙個引數(即第4個引數,就是那個lpvoid型的),然後執行緒裡就對應pparam,例如:

static uint threadproc(lpvoid pparam) 

執行緒函式是**函式,因此它必須是靜態成員函式或者是類外部宣告的全域性函式。

靜態成員函式呼叫非靜態成員變數 p

c 會區分兩種型別的成員函式 靜態成員函式和非靜態成員函式。這兩者之間的乙個重大區別是,靜態成員函式不接受隱含的this自變數。所以,它就無法訪問自己類的非靜態成員。在某些條件下,比如說在使用諸如pthread 它不支援類 此類的多執行緒庫時,就必須使用靜態的成員函式,因為其位址同c語言函式的位址相...

C 靜態成員函式訪問非靜態成員

如果類沒有被建立,則沒有對應的成員,也就無法訪問 下面這種方法需要先建立類,並將類作為引數傳遞給靜態成員函式才能訪問。include using namespace std class person class student public person static void get age st...

靜態成員和非靜態成員

類中的成員要麼是靜態的要麼是非靜態的。一般來說,靜態成員都歸屬於類所有,使用 static 關鍵字來宣告,不能在類的例項中訪問靜態成員 非靜態成員屬於類的例項 物件所有,不能按照類訪問靜態成員來訪問。下面用乙個例項來幫助理解 using system using system.collections...