2016-10-18 39 views
-1

條件如何使用自定義類型的函數指針在C++

我使用具有一個自定義爲波紋管式的框架:

typedef log (*CustomType) (
    int timeStamp, 
    const char* data, 
    int dataSize, 
    void* userData, 
    int dataType, 
    int viewId 
) 

和MyClass的init方法波紋管:

MyClass_Init (void **output, CustomType video, CustomType audio, void* userData) 

問題

我使用了類似波紋管的init方法,但總是收到錯誤(由於我使用框架,錯誤內容未顯示)。請指出我錯過了什麼。

CustomType videoInput; 
CustomType audioInput; 
void *output = malloc(sizeof(void*); 
void *userData = malloc(sizeof(void*));      
long result = MyClass_Init(&output, videoInput, audioInput, userData); 
+1

你的錯誤輸出是什麼? – nynohu

回答

1

一些事情出錯,這代碼:

  1. 你不能混用函數指針和方法指針。歸結起來,一個方法的this必須包含在方法調用簽名中。由於函數指針不包含this指針(它是一個函數,而不是一個方法指針),所以兩者不能匹配。

    大多數基於C語言的API都包含某種引用值(大多數框架調用refCon,context或userData),所以您可以創建一個調用您的方法的適配器函數。您的CustomType參數列表中的userData參數看起來像是其中的一個(請參閱文檔以確保)。

    無論您現在將MyClass_Init設置爲回調,您都可以提供一個userData。所以,如果該功能提供一個回調到庫被稱爲set_callback(MyCustomType callback, void* userData),這樣做

    MyClass *obj = new MyClass; // Or however you create your object 
        set_callback(MyClassCallbackAdapterFunction, obj); 
    

    與適配器功能,如:

    log MyClassCallbackAdapterFunction(int timeStamp, const char* data, int dataSize, void* userData, int dataType, int viewId) 
        { 
         MyClass *myThis = (MyClass*) userData; 
    
         // Here you can now call myThis->MyClass_Init(...) however you want to. 
        } 
    
  2. malloc(sizeof(void*))語句看起來像你誤會回報參數(也被一些教師稱爲「副作用」)。我沒有文檔給你正在使用的任何API /庫,但我很確定你應該不只是傳遞一個指針大小的緩衝區。要麼你只是在堆棧中提供一個指向緩衝區的指針,要麼你提供了一個完整的緩衝區(例如數組)和它的大小,這就是回調會寫入的地方等等。

相關問題