當前位置:首頁 » 廢水回用 » 怎麼樣用類方法做為回調函數參數

怎麼樣用類方法做為回調函數參數

發布時間: 2021-04-19 08:57:55

㈠ 如何做類的回調函數

類成員函數不能作為回調函數的主要原因在於類成員函數使用__thiscal參數傳遞方式,因此需要調用者(caller)通過ecx寄存器提供類對象的指針。而回調函數使用__stdcall參數傳遞方式,不具備這個特點。
所以想辦法在類成員函數被調用之前設置好ecx寄存器,就能在__stdcall調用的基礎上模擬出一個完好的__thiscall調用。使用靜態成員函數,靜態成員函數不使用this指針作為隱含參數,這樣就可以作為回調函數了。

不使用成員函數,直接使用普通C函數,為了實現在C函數中可以訪問類的成員變數,可以使用友元操作符(friend),在C++中將該C函數說明為類的友元即可。這種處理機制與普通的C編程中使用回調函數一樣。

回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方法直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。

㈡ 如何定義和實現一個類的成員函數為回調函數(轉)

通過查詢資料發現,其錯誤是普通的C++成員函數都隱含了一個傳遞函數作為參數,亦即this指針,C++通過傳遞this指針給其成員函數從而實現程序函數可以訪問C++的數據成員。這也可以理解為什麼C++類的多個實例可以共享成員函數卻-有不同的數據成員。由於this指針的作用,使得將一個CALL-BACK型的成員函數作為回調函數安裝時就會因為隱含的this指針使得函數參數個數不匹配,從而導致回調函數安裝失敗。要解決這一問題的關鍵就是不讓this指針起作用,通過採用以下兩種典型技術可以解決在C++中使用回調函數所遇到的問題。這種方法具有通用性,適合於任何C++。 1). 不使用成員函數,為了訪問類的成員變數,可以使用友元操作符(friend),在C++中將該函數說明為類的友元即可。 2). 使用靜態成員函數,靜態成員函數不使用this指針作為隱含參數,這樣就可以作為回調函數了。靜態成員函數具有兩大特點:其一,可以在沒有類實例的情況下使用;其二,只能訪問靜態成員變數和靜態成員函數,不能訪問非靜態成員變數和非靜態成員函數。由於在C++中使用類成員函數作為回調函數的目的就是為了訪問所有的成員變數和成員函數,如果做不到這一點將不具有實際意義。解決的辦法也很簡單,就是使用一個靜態類指針作為類成員,通過在類創建時初始化該靜態指針,如pThis=this,然後在回調函數中通過該靜態指針就可以訪問所有成員變數和成員函數了。這種處理辦法適用於只有一個類實例的情況,因為多個類實例將共享靜態類成員和靜態成員函數,這就導致靜態指針指向最後創建的類實例。為了避免這種情況,可以使用回調函數的一個參數來傳遞this指針,從而實現數據成員共享。這種方法稍稍麻煩,這里就不再贅述。

㈢ 如何實現類的成員函數作為回調函數

  1. 原理


如果試圖直接使用C++的成員函數作為回調函數將發生錯誤,甚至編譯就不能通過。 其錯誤原因是普通的C++成員函數都隱含了一個傳遞函數作為參數,亦即「this」指針,C++通過傳遞this指針給其成員函數從而實現
程序函數可以訪問C++的數據成員。這也可以理解為什麼C++類的多個實例可以共享成員函數卻-有不同的數據成員。由於this指針的作用,使得將一個
CALL-BACK型的成員函數作為回調函數安裝時就會因為隱含的this指針使得函數參數個數不匹配,從而導致回調函數安裝失敗。


2. 解決方案


要解決這一問題的關鍵
就是不讓this指針起作用,通過採用以下兩種典型技術可以解決在C++中使用回調函數所遇到的問題。這種方法具有通用性,適合於任何C++。


1). 不使用成員函數,為了訪問類的成員變數,可以使用友元操作符(friend),在C++中將該函數說明為類的友元即可。


2).
使用靜態成員函數,靜態成員函數不使用this指針作為隱含參數,這樣就可以作為回調函數了。靜態成員函數具有兩大特點:其一,可以在沒有類實例的情況下
使用;其二,只能訪問靜態成員變數和靜態成員函數,不能訪問非靜態成員變數和非靜態成員函數。由於在C++中使用類成員函數作為回調函數的目的就是為了訪
問所有的成員變數和成員函數,如果做不到這一點將不具有實際意義。解決的辦法也很簡單,就是使用一個靜態類指針作為類成員,通過在類創建時初始化該靜態指
針,如pThis=this,然後在回調函數中通過該靜態指針就可以訪問所有成員變數和成員函數了。這種處理辦法適用於只有一個類實例的情況,因為多個類
實例將共享靜態類成員和靜態成員函數,這就導致靜態指針指向最後創建的類實例。為了避免這種情況,可以使用回調函數的一個參數來傳遞this指針,從而實
現數據成員共享。這種方法稍稍麻煩,這里就不再贅述。


3. 舉例


class Test
{
public:

static void callBackFun(void){}; //因為callBackFun默認有一個const Test* 的指針
};


typedef void (*FPtr)(void);

void Fun(FPtr ptr)
{
ptr();
}


void main(void)
{
Fun(Test::callBackFun);
}

㈣ 如何將類成員函數作成一個回調函數

原理
如果試圖直接使用C++的成員函數作為回調函數將發生錯誤,甚至編譯就不能通過。 其錯誤原因是普通的C++成員函數都隱含了一個傳遞函數作為參數,亦即「this」指針,C++通過傳遞this指針給其成員函數從而實現
程序函數可以訪問C++的數據成員。這也可以理解為什麼C++類的多個實例可以共享成員函數卻-有不同的數據成員。由於this指針的作用,使得將一個
CALL-BACK型的成員函數作為回調函數安裝時就會因為隱含的this指針使得函數參數個數不匹配,從而導致回調函數安裝失敗。
2. 解決方案
要解決這一問題的關鍵
就是不讓this指針起作用,通過採用以下兩種典型技術可以解決在C++中使用回調函數所遇到的問題。這種方法具有通用性,適合於任何C++。
1). 不使用成員函數,為了訪問類的成員變數,可以使用友元操作符(friend),在C++中將該函數說明為類的友元即可。

2).
使用靜態成員函數,靜態成員函數不使用this指針作為隱含參數,這樣就可以作為回調函數了。靜態成員函數具有兩大特點:其一,可以在沒有類實例的情況下
使用;其二,只能訪問靜態成員變數和靜態成員函數,不能訪問非靜態成員變數和非靜態成員函數。由於在C++中使用類成員函數作為回調函數的目的就是為了訪
問所有的成員變數和成員函數,如果做不到這一點將不具有實際意義。解決的辦法也很簡單,就是使用一個靜態類指針作為類成員,通過在類創建時初始化該靜態指
針,如pThis=this,然後在回調函數中通過該靜態指針就可以訪問所有成員變數和成員函數了。這種處理辦法適用於只有一個類實例的情況,因為多個類
實例將共享靜態類成員和靜態成員函數,這就導致靜態指針指向最後創建的類實例。為了避免這種情況,可以使用回調函數的一個參數來傳遞this指針,從而實
現數據成員共享。這種方法稍稍麻煩,這里就不再贅述。
3. 舉例
class Test
{
public: static void callBackFun(void){}; //因為callBackFun默認有一個const Test* 的指針
};
typedef void (*FPtr)(void);void Fun(FPtr ptr)
{
ptr();
}
void main(void)
{
Fun(Test::callBackFun);
}

㈤ 請問大蝦,如何讓類的成員函數作為回調函數

給你三個思路。 1. 類成員函數不能作為回調函數的主要原因在於類成員函數使用__thiscal參數傳遞方式,因此需要調用者(caller)通過ecx寄存器提供類對象的指針。而回調函數使用__stdcall參數傳遞方式,不具備這個特點。 所以想辦法在類成員函數被調用之前設置好ecx寄存器,就能在__stdcall調用的基礎上模擬出一個完好的__thiscall調用。 2. 使用靜態成員函數,靜態成員函數不使用this指針作為隱含參數,這樣就可以作 為回調函數了。 3. 不使用成員函數,直接使用普通C函數,為了實現在C函數中可以訪問類的成員變 量,可以使用友元操作符(friend),在C++中將該C函數說明為類的友元即可。這種 處理機制與普通的C編程中使用回調函數一樣。

㈥ 如何定義一個類的成員函數為回調函數

其錯誤是普通的C++成員函數都隱含了一個傳 多個實例可以共享成員函數卻-有不同的數據成員。由於this指針的作用,使得將一個CALL-BACK型的成員函數作為回調函數安裝時就會因為隱含的 this指針使得函數參數個數不匹配,從而導致回調函數安裝失敗。要解決這一問題的關鍵就是不讓this指針起作用,通過採用以下兩種典型技術可以 解決在C++中使用回調函數所遇到的問題。這種方法具有通用性,適合於任何C++。 1). 不使用成員函數,為了訪問類的成員變數,可以使用友元操作符(friend),在C++中將該函數說明為類的友元即可。 2). 使用靜態成員函數,靜態成員函數不使用this指針作為隱含參數,這樣就可以作為回調函數了。靜態成員函數具有兩大特點:其一,可以 在沒有類實例的情況下使用;其二,只能訪問靜態成員變數和靜態成員函數,不能訪問非靜態成員變數和非靜態成員函數。由於在C++中使用類成員 函數作為回調函數的目的就是為了訪問所有的成員變數和成員函數,如果做不到這一點將不具有實際意義。解決的辦法也很簡單,就是使用一個靜態 類指針作為類成員,通過在類創建時初始化該靜態指針,如pThis=this,然後在回調函數中通過該靜態指針就可以訪問所有成員變數和成員函數了。 這種處理辦法適用於只有一個類實例的情況,因為多個類實例將共享靜態類成員和靜態成員函數,這就導致靜態指針指向最後創建的類實例。為了避 免這種情況,可以使用回調函數的一個參數來傳遞this指針,從而實現數據成員共享。這種方法稍稍麻煩,這里就不再贅述。 例子:#include"stdafx.h"#include<iostream#include<assert.husingnamespacestd;classTest{public:friendvoidcallBackFun(void){ cout<<"CallBack Function!";}//因為callBackFun默認有一個const Test* 的指針};typedefvoid(*FPtr)(void);voidFun(FPtr ptr){ptr();}intmain(void){Fun(callBackFun);return0;}原文請訪問:

㈦ 如何使 類的成員函數作為回調函數

如果試圖直接使用C++的成員函數作為回調函數將發生錯誤,甚至編譯就不能通過。其錯誤是普通的C++成員函數都隱含了一個傳遞函數作為參數,亦即this指針,C++通過傳遞this指針給其成員函數從而實現程序函數可以訪問C++的數據成員。這也可以理解為什麼C++類的多個實例可以共享成員函數卻-有不同的數據成員。由於this指針的作用,使得將一個CALL-BACK型的成員函數作為回調函數安裝時就會因為隱含的this指針使得函數參數個數不匹配,從而導致回調函數安裝失敗。要解決這一問題的關鍵就是不讓this指針起作用,通過採用以下兩種典型技術可以解決在C++中使用回調函數所遇到的問題。這種方法具有通用性,適合於任何C++。 1). 不使用成員函數,為了訪問類的成員變數,可以使用友元操作符(friend),在C++中將該函數說明為類的友元即可。 2). 使用靜態成員函數,靜態成員函數不使用this指針作為隱含參數,這樣就可以作為回調函數了。靜態成員函數具有兩大特點:其一,可以在沒有類實例的情況下使用;其二,只能訪問靜態成員變數和靜態成員函數,不能訪問非靜態成員變數和非靜態成員函數。由於在C++中使用類成員函數作為回調函數的目的就是為了訪問所有的成員變數和成員函數,如果做不到這一點將不具有實際意義。解決的辦法也很簡單,就是使用一個靜態類指針作為類成員,通過在類創建時初始化該靜態指針,如pThis=this,然後在回調函數中通過該靜態指針就可以訪問所有成員變數和成員函數了。 這種處理辦法適用於只有一個類實例的情況,因為多個類實例將共享靜態類成員和靜態成員函數,這就導致靜態指針指向最後創建的類實例。為了避免這種情況,可以使用回調函數的一個參數來傳遞this指針,從而實現數據成員共享。這種方法稍稍麻煩,這里就不再贅述。(關於靜態方法訪問非靜態變數和函數的方式請見 using namespace std;class A{public: friend void callback() //友元函數作為回調函數 friend方式實現{cout<<"回調函數開始執行了!"<<endl;}};void f(void (*p)()){p();}int main(){void (*p)(); p=callback;f(p);return 0;}例2:#include<iostream using namespace std;class A{public: static void callback() //類的成員函數作為回調函數 static方式實現{cout<<"回調函數開始執行了!"<<endl;}};void f(void (*p)()){p();}int main(){void (*p)(); p=A::callback;f(p);return 0;}還可以把f()函數設為類的成員函數: #include<iostream using namespace std;class A{public: static void callback() //類的成員函數作為回調函數 static方式實現{cout<<"回調函數開始執行了!"<<endl;}void f(void (*p)()){p();}};int main(){A a;void (*p)();

㈧ C++類的成員函數作為回調函數參數

C加加 11的新特性,函數對象,在functional頭文件中定義。
我們可以將一個類和它的成員函數綁定在一起,成為一個函數對象,這樣,我們在調用這個函數對象的時候,它的類實例是存在的。

㈨ 如何在類裡面定義回調函數

如果試圖直接使用C++的成員函數作為回調函數將發生錯誤,甚至編譯就不能通過。
其錯誤是普通的C++成員函數都隱含了一個傳
多個實例可以共享成員函數卻-有不同的數據成員。由於this指針的作用,使得將一個CALL-BACK型的成員函數作為回調函數安裝時就會因為隱含的
this指針使得函數參數個數不匹配,從而導致回調函數安裝失敗。要解決這一問題的關鍵就是不讓this指針起作用,通過採用以下兩種典型技術可以
解決在C++中使用回調函數所遇到的問題。這種方法具有通用性,適合於任何C++。
1). 不使用成員函數,為了訪問類的成員變數,可以使用友元操作符(friend),在C++中將該函數說明為類的友元即可。
2). 使用靜態成員函數,靜態成員函數不使用this指針作為隱含參數,這樣就可以作為回調函數了。靜態成員函數具有兩大特點:其一,可以
在沒有類實例的情況下使用;其二,只能訪問靜態成員變數和靜態成員函數,不能訪問非靜態成員變數和非靜態成員函數。由於在C++中使用類成員
函數作為回調函數的目的就是為了訪問所有的成員變數和成員函數,如果做不到這一點將不具有實際意義。解決的辦法也很簡單,就是使用一個靜態
類指針作為類成員,通過在類創建時初始化該靜態指針,如pThis=this,然後在回調函數中通過該靜態指針就可以訪問所有成員變數和成員函數了。
這種處理辦法適用於只有一個類實例的情況,因為多個類實例將共享靜態類成員和靜態成員函數,這就導致靜態指針指向最後創建的類實例。為了避
免這種情況,可以使用回調函數的一個參數來傳遞this指針,從而實現數據成員共享。這種方法稍稍麻煩,這里就不再贅述。
例子:#include"stdafx.h"#include<iostream#include<assert.husingnamespacestd;classTest{public:friendvoidcallBackFun(void){ cout<<"CallBack Function!";}//因為callBackFun默認有一個const Test* 的指針};typedefvoid(*FPtr)(void);voidFun(FPtr ptr){ptr();}intmain(void){Fun(callBackFun);return0;}原文請訪問:

㈩ 如何定義和實現一個類的成員函數為回調函數

回調函數就是被調用者回頭調用調用者的函數。 回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用為調用它所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。 使用回調函數實際上就是在調用某個函數(通常是API函數)時,將自己的一個函數(這個函數為回調函數)的地址作為參數傳遞給那個被調用函數。而該被調用函數在需要的時候,利用傳遞的地址調用回調函數。 回調函數,就是由你自己寫的,你需要調用另外一個函數,而這個函數的其中一個參數,就是你的這個回調函數名。這樣,系統在必要的時候,就會調用你寫的回調函數,這樣你就可以在回調函數里完成你要做的事。 要定義和實現一個類的成員函數為回調函數需要做三件事:a.聲明;b.定義; c.設置觸發條件,就是在你的函數中把你的回調函數名作為一個參數,以便系統調用如: 聲明回調函數類型 typedef void (*FunPtr)(void); 定義回調函數class A{public: static void callBackFun(void) //回調函數,必須聲明為static{}}; 設置觸發條件 void Funtype(FunPtr p){p();} void main(void){ Funtype(A::callBackFun);} C. 回調函數與API函數 回調和API非常接近,他們的共性都是跨層調用的函數。但區別是API是低層提供給高層的調用,一般這個函數對高層都是已知的;而回調正好相反,他是高層提供給底層的調用,對於低層他是未知的,必須由高層進行安裝,這個安裝函數其實就是一個低層提供的API,安裝後低層不知道這個回調的名字,但它通過一個函數指針來保存這個回調函數,在需要調用時,只需引用這個函數指針和相關的參數指針。 其實:回調就是該函數寫在高層,低層通過一個函數指針保存這個函數,在某個事件的觸發下,低層通過該函數指針調用高層那個函數。

熱點內容
丁度巴拉斯情人電影推薦 發布:2024-08-19 09:13:07 瀏覽:886
類似深水的露點電影 發布:2024-08-19 09:10:12 瀏覽:80
《消失的眼角膜》2電影 發布:2024-08-19 08:34:43 瀏覽:878
私人影院什麼電影好看 發布:2024-08-19 08:33:32 瀏覽:593
干 B 發布:2024-08-19 08:30:21 瀏覽:910
夜晚看片網站 發布:2024-08-19 08:20:59 瀏覽:440
台灣男同電影《越界》 發布:2024-08-19 08:04:35 瀏覽:290
看電影選座位追女孩 發布:2024-08-19 07:54:42 瀏覽:975
日本a級愛情 發布:2024-08-19 07:30:38 瀏覽:832
生活中的瑪麗類似電影 發布:2024-08-19 07:26:46 瀏覽:239