導航:首頁 > 廢水知識 > 回調函數中怎麼用其他類中的對象

回調函數中怎麼用其他類中的對象

發布時間:2023-02-08 15:53:35

『壹』 如何在一個類的方法中引用另一個類中方法的對象數組

可能你理解上有問題。
不太明白你的意思,所以我分開解釋。
如果是在定義的時候就引用,下面兩種。
1.兩個都是類,即類的靜態變數(static修飾),一個類自然可以引用靜態變數,因為靜態變數是在程序進入main函數前就已經初始化完了。
2.一個類A一個實例B(A類產生的對象),A當然無法在類的內部引用(即定義中),因為實例是在程序中動態分配的內存,類A必然先於實例B存在,所以A並不能知道B的存在。B可以引用類A的靜態變數,理由同1。
如果是在運行時才引用。
你只要在類A里寫一個函數,例如function(B
b),這樣你要調用的時候通過這個函數做介面就行了,至於b你要做什麼,就是你的事了。

『貳』 回調函數是怎麼實現的為什麼系統就會去調用回調函數

回調函數是應用程序提供給Windows系統DLL或其它DLL調用的函數,一般用於截獲消息、獲取系統信息或處理非同步事件。應用程序把回調函數的地址指針告訴DLL,而DLL在適當的時候會調用該函數。回調函數必須遵守事先規定好的參數格式和傳遞方式,否則DLL一調用它就會引起程序或系統的崩潰。通常情況下,回調函數採用標准WindowsAPI的調用方式,即__stdcall,當然,DLL編制者可以自已定義調用方式,但客戶程序也必須遵守相同的規定。在__stdcall方式下,函數的參數按從右到左的順序壓入堆棧,除了明確指明是指針或引用外,參數都按值傳遞,函數返回之前自己負責把參數從堆棧中彈出。 程序在調用一個函數(function)時(通常指api).相當於程序(program)呼叫(Call)了一個函數(function)關系表示如下: call(調用) program --------------------→ dll 程序在調用一個函數時,將自己的函數的地址作為參數傳遞給程序調用的函數時(那麼這個自己的函數稱回調函數).需要回調函數的 DLL 函數往往是一些必須重復執行某些操作的函數.關系表示如下: call(調用) program --------------------→ dll ↑ ¦ ¦_______________________________¦ callback(回調) 當你調用的函數在傳遞返回值給回調函數時,你就可以利用回調函數來處理或完成一定的操作。至於如何定義自己的回調函數,跟具體使用的API函數有關,很多不同類別的回調函數有各種各樣的參數,有關這些參數的描述一般在幫助中有說明回調函數的參數和返回值等.其實簡單說回調函數就是你所寫的函數滿足一定條件後,被DLL調用! Windows 系統還包含著另一種更為廣泛的回調機制,即消息機制。消息本是 Windows 的基本控制手段,是一種變相的函數調用。發送消息的目的是通知收方運行一段預先准備好的代碼,相當於調用一個函數。消息所附帶的 WParam 和 LParam 相當於函數的參數,應用程序可以主動發送消息,更多情況下是坐等 Windows 發送消息。一旦消息進入所屬消息隊列,便檢感興趣的那些,跳轉去執行相應的消息處理代碼。操作系統本是為應用程序服務,由應用程序來調用。而應用程序一旦啟動,卻要反過來等待操作系統的調用。這分明也是一種回調,或者說是一種廣義回調。其實,應用程序之間也可以形成這種回調。假如進程 B 收到進程 A 發來的消息,啟動了一段代碼,其中又向進程 A 發送消息,這就形成了回調。這種回調比較隱蔽,弄不好會搞成遞歸調用,若缺少終止條件,將會循環不已,直至把程序搞垮。利用消息也可以構成狹義回調。把回調函數地址換成窗口 handle。如此,當需要比較數據大小時,不是去調用回調函數,而是借 API 函數 SendMessage 向指定窗口發送消息。收到消息方負責比較數據大小,把比較結果通過消息本身的返回值傳給消息發送方。所實現的功能與回調函數並無不同。當然,此例中改為消息純屬畫蛇添腳,反倒把程序搞得很慢。但其他情況下並非總是如此,特別是需要非同步調用時,發送消息是一種不錯的選擇。假如回調函數中包含文件處理之類的低速處理,調用方等不得,需要把同步調用改為非同步調用,去啟動一個單獨的線程,然後馬上執行後續代碼,其餘的事讓線程慢慢去做。一個替代辦法是借 API 函數 PostMessage 發送一個非同步消息,然後立即執行後續代碼。這要比自己搞個線程省事許多,而且更安全。 只要與編程有關,無論何事都離不開 object。但 object 並未消除回調,反而把它發揚光大,弄得到處都是,只不過大都以事件(event)的身份出現,鑲嵌在某個結構之中,顯得更正統,更容易被人接受。應用程序要使用某個構件,總要先弄清構件的屬性、方法和事件,然後給構件屬性賦值,在適當的時候調用適當的構件方法,還要給事件編寫處理常式,以備構件代碼來調用。何謂事件?它不過是一個指向事件常式的地址,與回調函數地址沒什麼區別。不過,此種回調方式比傳統回調函數要高明許多。首先,它把讓人不太舒服的回調函數變成一種自然而然的處理常式,使編程者頓覺氣順。再者,地址是一個危險的東西,用好了可使程序加速,用不好處處是陷阱,程序隨時都會崩潰。現代編程方式總是想法把地址隱藏起來(隱藏比較徹底的如 VB 和 Java),其代價是降低了程序效率。事件常式(?)使編程者無需直接操作地址,但並不會使程序減速。 回調用於層間協作,上層將本層函數安裝在下層,這個函數就是回調,而下層在一定條件下觸發回調,例如作為一個驅動,是一個底層,他在收到一個數據時,除了完成本層的處理工作外,還將進行回調,將這個數據交給上層應用層來做進一步處理,這在分層的數據通信中很普遍。其實回調和API非常接近,他們的共性都是跨層調用的函數。但區別是API是低層提供給高層的調用,一般這個函數對高層都是已知的;而回調正好相反,他是高層提供給底層的調用,對於低層他是未知的,必須由高層進行安裝,這個安裝函數其實就是一個低層提供的API,安裝後低層不知道這個回調的名字,但它通過一個函數指針來保存這個回調,在需要調用時,只需引用這個函數指針和相關的參數指針。 其實:回調就是該函數寫在高層,低層通過一個函數指針保存這個函數,在某個事件的觸發下,低層通過該函數指針調用高層那個函數。 軟體模塊之間總是存在著一定的介面,從調用方式上,可以把他們分為三類:同步調用、回調和非同步調用。同步調用是一種阻塞式調用,調用方要等待對方執行完畢才返回,它是一種單向調用;回調是一種雙向調用模式,也就是說,被調用方在介面被調用時也會調用對方的介面;非同步調用是一種類似消息或事件的機制,不過它的調用方向剛好相反,介面的服務在收到某種訊息或發生某種事件時,會主動通知客戶方(即調用客戶方的介面)。回調和非同步調用的關系非常緊密,通常我們使用回調來實現非同步消息的注冊,通過非同步調用來實現消息的通知。同步調用是三者當中最簡單的,而回調又常常是非同步調用的基礎。 對於不同類型的語言(如結構化語言和對象語言)、平台(Win32、JDK)或構架(CORBA、DCOM、WebService),客戶和服務的交互除了同步方式以外,都需要具備一定的非同步通知機制,讓服務方(或介面提供方)在某些情況下能夠主動通知客戶,而回調是實現非同步的一個最簡捷的途徑。 對於一般的結構化語言,可以通過回調函數來實現回調。回調函數也是一個函數或過程,不過它是一個由調用方自己實現,供被調用方使用的特殊函數。在面向對象的語言中,回調則是通過介面或抽象類來實現的,我們把實現這種介面的類成為回調類,回調類的對象成為回調對象。對於象C++或Object Pascal這些兼容了過程特性的對象語言,不僅提供了回調對象、回調方法等特性,也能兼容過程語言的回調函數機制。 Windows平台的消息機制也可以看作是回調的一種應用,我們通過系統提供的介面注冊消息處理函數(即回調函數),從而實現接收、處理消息的目的。由於Windows平台的API是用C語言來構建的,我們可以認為它也是回調函數的一個特例。 對於分布式組件代理體系CORBA,非同步處理有多種方式,如回調、事件服務、通知服務等。事件服務和通知服務是CORBA用來處理非同步消息的標准服務,他們主要負責消息的處理、派發、維護等工作。對一些簡單的非同步處理過程,我們可以通過回調機制來實現。

『叄』 如何向回調函數中傳入其他參數

成員函數名不能作為參數傳遞,否則會發生錯誤,因為裡面隱藏著一個this 指針
回調函數,就是由你自己寫的。你需要調用另外一個函數,而這個函數的其中一個參數,就
是你的這個回調函數名。這樣,系統在必要的時候,就會調用你寫的回調函數,這樣你就可
以在回調函數里完成你要做的事。
模塊A有一個函數foo,它向模塊B傳遞foo的地址,然後在B裡面發生某種事件(event)時,通過從A裡面傳遞過來的foo的地址調用foo,通知A發生了什麼事情,讓A作出相應反應。 那麼我們就把foo稱為回調函數。

例子:
回調函數是一個很有用,也很重要的概念。當發生某種事件時,系統或其他函數將會自動調用你定義的一段函數。回調函數在windows編程使用的場合很多,比如Hook回調函數:MouseProc,GetMsgProc以及EnumWindows,DrawState的回調函數等等,還有很多系統級的回調過程。本文不準備介紹這些函數和過程,而是談談實現自己的回調函數的一些經驗。
之所以產生使用回調函數這個想法,是因為現在使用VC和Delphi混合編程,用VC寫的一個DLL程序進行一些時間比較長的非同步工作,工作完成之後,需要通知使用DLL的應用程序:某些事件已經完成,請處理事件的後續部分。開始想過使用同步對象,文件影射,消息等實現DLL函數到應用程序的通知,後來突然想到可不可以在應用程序端先寫一個函數,等需要處理後續事宜的時候,在DLL里直接調用這個函數即可。
於是就動手,寫了個回調函數的原形。在VC和 Delphi里都進行了測試
一:聲明回調函數類型。
vc版
typedef int (WINAPI *PFCALLBACK)(int Param1,int Param2) ;
二:聲明回調函數原形
聲明函數原形
vc版
int WINAPI CBFunc(int Param1,int Param2);
三: 回調函數調用調用者
調用回調函數的函數我把它放到了DLL里,這是一個很簡單的VC生成的WIN32 DLL.並使用DEF文件輸出其函數名 TestCallBack。實現如下:
PFCALLBACK gCallBack=0;

void WINAPI TestCallBack(PFCALLBACK Func)
{
if(Func==NULL)return;
gCallBack=Func;
DWORD ThreadID=0;
HANDLE hThread = CreateThread( NULL, NULL, Thread1, LPVOID(0), &ThreadID );
return;
}
此函數的工作把傳入的 PFCALLBACK Func參數保存起來等待使用,並且啟動一個線程。聲明了一個函數指針PFCALLBACK gCallBack保存傳入的函數地址。
四: 回調函數如何被使用:
TestCallBack函數被調用後,啟動了一個線程,作為演示,線程人為的進行了延時處理,並且把線程運行的過程列印在屏幕上.
五:萬事具備
使用vc和Delphi各建立了一個工程,編寫回調函數的實現部分
VC版
int WINAPI CBFunc(int Param1,int Param2)
{
int res= Param1+Param2;
TCHAR Buffer[256]="";
sprintf(Buffer,"callback result = %d",res);
MessageBox(NULL,Buffer,"Testing",MB_OK); //演示回調函數被調用
return res;
}

Delphi版
function CBFunc(Param1,Param2:integer):integer;
begin
result:= Param1+Param2;
TForm1.Edit1.Text:=inttostr(result); / /演示回調函數被調用
end;

使用靜態連接的方法連接DLL里的出口函數 TestCallBack,在工程里添加 Button( 對於Delphi的工程,還需要在Form1上放一個Edit控制項,默認名為Edit1)。
響應ButtonClick事件調用 TestCallBack

TestCallBack(CBFunc) //函數的參數CBFunc為回調函數的地址

函數調用創建線程後立刻返回,應用程序可以同時干別的事情去了。現在可以看到屏幕上不停的顯示字元串,表示dll里創建的線程運行正常。一會之後,線程延時部分結束結束,vc的應用程序彈出MessageBox,表示回調函數被調用並顯示根據Param1,Param2運算的結果,Delphi的程序edit控制項里的文本則被改寫成Param1,Param2 的運算結果。

『肆』 C++如何在一個類的成員函數中調用另一個類的成員函數

1、首先聲明如下所示的類,類內部定義一個public的整型數據成員。

『伍』 c++11 之回調函數

什麼是回調函數,以及在c++中如何使用?

回調函數就是將函數 作為參數傳給其他的函數。

c++ 中有三種方式實現:1、函數指針;2、函數對象 ;3、lambda 函數

函數指針比較容易理解,與普通的參數的差別在於是一個函數指針,函數指針可帶參數。

而函數對象 是指有重載()的對象或者類。

兩者的差別與比較:

對於第一種,不同的回調函數需要不同的實現。然後調用的時候要調用不同的名字。

而對於第二種方式,可以在類內實現多種方式,而不同的調用可以通過類的成員設置,使得介面更明確和友好。

『陸』 MFC怎樣在一個類成員函數中調用其它類的對象

這里我知道有兩種方法
1。中轉實現。
可以將doc類作為一個中轉,在其他的非mainframe類中都可以使用下列語句調用 doc中的對象
CFrameWnd *pFrame=(CFrameWnd *)(AfxGetApp()->m_pMainWnd);
CMOfqk0028Doc * pDoc=(CMOfqk0028Doc
*)pFrame->GetActiveDocument();

然後用pDoc指針調用doc類中對象,
2,直接定義實現
比如 需要調用的類叫做CMyMfDlg類
在需要調用該類的時候 首先定義頭文件#include 「CMyMfDlg.h" 然後在使用時,申明一個對象 CMyMfDlg dlg 然後就可以使用該類中的對象,比如說調用函數dlg.Find(),或者調用成員變數dlg.m_you
(由於情況很多種 如果還時不行可以聯系我 大家一起討論)

『柒』 如何在回調函數中調用某個類的成員函數

如果試圖直接使用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;}原文請訪問:

閱讀全文

與回調函數中怎麼用其他類中的對象相關的資料

熱點內容
反滲透的設備怎麼清洗 瀏覽:127
孝感生活污水往哪裡排 瀏覽:187
居民污水去向如何填寫 瀏覽:631
北京回出進河北用隔離不 瀏覽:493
中原凈化車間凈化器大概多少錢 瀏覽:170
國美凈化器塑料膜怎麼拆 瀏覽:869
沁人園凈水器多少錢 瀏覽:530
dmf蒸餾回收過程危險分析 瀏覽:385
蓮蓬頭怎麼除垢 瀏覽:969
近視鏡片怎麼裝進樹脂 瀏覽:899
提升泵故障影響 瀏覽:782
機油濾芯蓋壞了有什麼影響 瀏覽:108
飲水機接水老有渣子怎麼回事 瀏覽:590
抽污水池哪裡專業 瀏覽:375
凈水機凈水流量達到多少標尺 瀏覽:316
水壺的水垢怎麼處理 瀏覽:457
煙過濾紙層數 瀏覽:800
華陽反滲透膜殼 瀏覽:897
銅球做的濾芯叫什麼 瀏覽:36
晉通飲水機有什麼樣的 瀏覽:379