C++的成員函數作為回呼函數

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.