1. 程式人生 > >類中函式作為回撥函式發現的問題

類中函式作為回撥函式發現的問題

最近在做一個專案用到圓剛的視訊採集卡,需要對其sdk進行二次開發,拿到幀進行處理。

按照要求,回撥函式是靜態函式,自己定義了回撥函式,然後把demo的程式碼粘過來,編譯,報錯!!顯示靜態函式不能非法引用變數。

無奈,諮詢技術,說”靜態函式只能呼叫靜態變數,而且想要在靜態函式裡面呼叫成員函式,就必須要物件的指標“。

這樣子的:CMyDlg* pThis = (CMyDlg*)lUserData;

也就是說肯定不能直接在回撥函式裡實現功能了,要呼叫其他函式實現,

雲裡霧裡啊,沒辦法,參照demo,回撥函式內重新定義類指標,然後呼叫類的成員函式,然後在成員函式內實現。

回撥函式callback內部這樣:CMyDlg* pThis = (CMyDlg*)lUserData;

        pThis->ShowPIP;  //ShowPIP是實現功能的函式主體

也就是說,回撥函式呼叫一個成員函式實現主體功能;這樣改過,編譯,通過了!執行,靠,閃退!!

苦想多天,也不知道怎麼回事,只能百度了,這篇文章給了本人很大啟發,點選開啟連結,如果試圖直接使用C++的成員函式作為回撥函式將發生錯誤,甚至編譯就不能通過,

確實是這樣,感謝作者。

好了,回撥函式本身肯定是靜態函式,不能改,但是真正實現功能的主體函式(也就是回撥函式內呼叫的處理函式ShowPIP)可以定義成普通的C函式,而不是類的成員函式,

進而相關的變數也就只能在原始檔中定義為全域性的變數。這樣子:

void ShowPIP(DataType A, DataType B);//定義

void ShowPIP(DataType A, DataType B)

{

...

}//函式主體

//回撥函式主體

BOOL WINAPI callback(*, *, ...)

{

    ShowPIP(A, B);  

    return TRUE;

}

編譯,沒錯!

執行,正常!

Nice!!!

總結:回撥函式呼叫函式時不使用成員函式,直接使用普通C函式。


相關推薦

函式作為函式發現的問題

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

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

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

QT的成員函式作為函式

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

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

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

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

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

如何使 的成員函式作為函式

如果試圖直接使用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

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

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

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

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

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

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

如何寫JavaScript的callback函式

 如何寫回調函式?  如果自己在寫一個方法或函式,你有可能會遇到需要一個回撥函式。下面就是一個簡單的常見回撥函式例子: function mySandwich(param1, param2, callback) { alert('Started eating my

【JS】關於for迴圈的click函式索引值錯誤的思考

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=dev

JavaScript的引用函式、呼叫函式函式

引用函式與呼叫函式的區別 引用函式與呼叫函式的差別與函式名稱後是否附有括號()有關。函式引用只會單獨出現,但函式呼叫則必定後隨括號,很多時候還附有自變數。 舉個例子 // 函式引用 程式碼一 function f(){ var x = 5; retu

echart的serieslabel formatter函式使用及樣式。

formatter { name: '生物質', type: 'bar', stack: '能源', barWidth: '80%', label: { normal: { show: true, position: 'insideRight

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

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

函式指標&函式&linux的signal函式

1.  int (*func)();函式指標,指向的函式為空引數,返回整型; 2. 回撥函式是一個程式設計師不能顯式呼叫的函式;通過將回調函式的地址傳給被呼叫者從而實現呼叫。 回撥函式是一個通過函式指標呼叫的函式。如果你把函式的指標(地址)作為引數傳遞給另一個函式,當這個指標

Lua知識點_高階_c++呼叫Lua函式

以下是在cocos2dx-3.10 lua中 1.概述 以下主要用於lua中執行了c++函式,在c++函式執行完成後,呼叫Lua的回撥函式。 注意:若c++中使用了多執行緒,這裡的這種呼叫Lua的方法會有一定機率導致程式崩潰,因為Lua不支援多執行緒,   替代的方法是在L

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

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

如何實現成員函式函式

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

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

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