1. 程式人生 > >如何實現類的成員函式作為回撥函式

如何實現類的成員函式作為回撥函式

回撥函式(Callback   function)大量用於Windows的系統服務,通過它,程式設計師可以安裝裝置驅動程式和訊息過濾系統,以控制Windows的有效使用。許多程式設計師都發現,利用MFC或者其它的C++應用編寫回調函式是非常麻煩的,其根本原因是回撥函式是基於C程式設計的Windows   SDK的技術,不是針對C++的,程式設計師可以將一個C函式直接作為回撥函式,但是如果試圖直接使用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指標,從而實現資料成員共享。

相關推薦

如何實現成員函式作為函式

回撥函式(Callback   function)大量用於Windows的系統服務,通過它,程式設計師可以安裝裝置驅動程式和訊息過濾系統,以控制Windows的有效使用。許多程式設計師都發現,利用MFC或者其它的C++應用編寫回調函式是非常麻煩的,其根本原因是回撥函式是基於

C++中 執行緒函式為靜態函式成員函式作為函式

 執行緒函式為靜態函式:   執行緒控制函式和是不是靜態函式沒關係,靜態函式是在構造中分配的地址空間,只有在析構時才釋放也就是全域性的東西,不管執行緒是否執行,靜態函式的地址是不變的,並不在執行緒堆疊中static只是起了一個裝飾的作用,所以二者並沒有必然的關係   執行緒也是一種

成員函式作為函式(外一篇:友元函式

問題的提出  我們已知道類具有封裝和資訊隱藏的特性。只有類的成員函式才能訪問類的私有成員,程式中的其他函式是無法訪問私有成員的。非成員函式可以訪問類中的公有成員,但是如果將資料成員都定義為公有的,這又破壞了隱藏的特性。另外,應該看到在某些情況下,特別是在對某些成員函式多次呼叫時,由於引數傳遞,型別檢查和安全性

如何使 成員函式作為函式

如果試圖直接使用C++的成員函式作為回撥函式將發生錯誤,甚至編譯就不能通過。其錯誤是普通的C++成員函式都隱含了一個傳遞函式作為引數,亦即“this”指標,C++通過傳遞this指標給其成員函式從而實現程式函式可以訪問C++的資料成員。這也可以理解為什麼C++類的多個例項

如何讓C++成員函式作為函式

Element Implementation Argument-passing order Right to left. Argument-passing convention By value, unless a pointer or reference type is passed. Stack-ma

QT中成員函式作為函式

    這裡主要實現的功能:需要設計一個外掛,把外掛內的資料通過函式指標引數的方式傳遞到另外一個類中,顯示出來,使用回撥函式的方式 http://blog.csdn.net/ksn13/article/details/40538083,程式碼的邏輯和上述網站的第三種方法一樣

在C++的中使用成員函式作為函式

由於類有隱式的this指標,所以不能直接把類成員函式作為回撥函式使用。現用一例子來展示如何在類中使用類成員函式作為回撥函式。 此例子僅用於展示如何在類中使用類成員函式作為回撥函式 程式碼如下: #include "stdafx.h" #include

從C++成員函式作為函式說起

在網路訊息處理中經常要用到回撥機制。 例如處理非同步網路操作的前攝器設計模式(Proactor),(可以參考 《C++ 網路程式設計 卷2》中關於ACE Proactor模式實現 )。 非同步的 Web 伺服器將這樣來利用前攝器模式:首先讓 Web 伺服器向 OS 發出非同步

函式作為函式發現的問題

最近在做一個專案用到圓剛的視訊採集卡,需要對其sdk進行二次開發,拿到幀進行處理。 按照要求,回撥函式是靜態函式,自己定義了回撥函式,然後把demo的程式碼粘過來,編譯,報錯!!顯示靜態函式不能非法引用變數。 無奈,諮詢技術,說”靜態函式只能呼叫靜態變數,而且想要在靜態函式

C++成員函式作為函式的問題

1. 程式設計分兩類 一,應用程式設計和系統程式設計 系統程式設計就是編寫底層的庫, 應用程式設計就是利用已經編寫好的庫的介面來編寫某種具有某些功能的程式,即應用 所謂的庫,就是為了給應用提

什麼是函式,如何定義和實現一個成員函式函式(轉)

C/C++中回撥函式初探    簡介   對於很多初學者來說,往往覺得回撥函式很神祕,很想知道回撥函式的工作原理。本文將要解釋什麼是回撥函式、它們有什麼好處、為什麼要使用它們等等問題,在開始之前,假設你已經熟知了函式指標。   什麼是回撥函式?   簡而言之,回撥函

如何實現成員函式函式

  如果試圖直接使用C++的成員函式作為回撥函式將發生錯誤,甚至編譯就不能通過。通過查詢資料發現,其錯誤是普通的C++成員函式都隱含了一個傳遞函式作為引數,亦即“this”指標,C++通過傳遞this指標給其成員函式從而實現程式函式可以訪問C++的資料成員。這也可以

c++成員函式函式為啥要申明為static的

  眾所周知,C++的類成員函式不能像普通函式那樣用於回撥,因為每個成員函式都需要有一個物件例項去呼叫它。         通常情況下,要實現成員函式作為回撥函式,一種常用的方法就是把該成員函式設計為靜態成員函式,但這樣做有一個缺點,就是會破壞類的結構性,因為靜態成員

11月6日排序函式,匿名函式函式,遞迴函式, zip函式

##### 排序sort, sorted的區別: list.sort(func=None, key=None, reverse=False(or True)) 對於reverse這個bool型別引數,當reverse=False時:為正向排序;當reverse=True時:為方向排序。預設為Fal

總結-全域性環境&執行流程&錯誤型別&垃圾回收機制&閉包&函式&函式

全域性環境&執行流程&錯誤型別&垃圾回收機制&閉包&函式&回撥函式 全域性環境 1.函式中的this表示改函式所屬的物件 2.window物件的成員在呼叫時可以省略window 執行流程 1.編譯程式碼:當前script程式碼段

【轉載】鉤子函式函式

在訊息處理機制中必不可少的一組CP,即回撥和鉤子。 鉤子的概念源於Windows的訊息處理機制,通過設定鉤子,應用程式可以對所有的訊息事件進行攔截,然後執行鉤子函式,對訊息進行想要的處理方式。 接下來是一段js程式碼,主要用於給btn設定點選的鉤子函式。 let btn = document.getEl

102_js筆記5_js的函式(普通函式,匿名函式,箭頭函式函式函式的提升,自調函式

一,函式的定義和使用 1) 函式宣告方式 function add(num1,num2){       return num1+num2;   } function add(num1,num2){ return num1+num2; }

為什麼要使用函式函式是什麼呢,它涉及到了什麼? 摘錄總結

最近在學習安卓,之前在寫web程式碼的時候不常用到回撥函式,也就在面試題上見過,學了幾天安卓,回調出現的挺頻繁的,所以想深入瞭解一下。 回撥函式是什麼呢? 知乎上有很多網友寫出了很精彩的回答,可以去看一看。 "回撥函式就是一個通過指標呼叫的函式,如果你把函式

JavaScript基礎總結深入(資料型別、資料_變數_記憶體、物件、函式函式、this)

資料型別 1、分類 JavaScript 資料型別分為兩大類,分別為:基本型別,又稱為值型別;物件型別,又稱為引用型別。 基本(值)型別 String:任意字元 Number:任意的數字 boolean: true/false undefined: undefi

Go基礎系列:函式(2)——函式和閉包

回撥函式和閉包 當函式具備以下兩種特性的時候,就可以稱之為高階函式(high order functions): 函式可以作為另一個函式的引數(典型用法是回撥函式) 函式可以返回另一個函式,即讓另一個函式作為這個函式的返回值(典型用法是閉包) 一般來說,附帶的還具備一個特性:函式可以作為一個值賦值給變數