2016-10-18 2 views
-1

ZustandWie benutzerdefinierten Typ Funktionszeiger in C++

I einen Rahmen verwenden verwenden, die eine benutzerdefinierte als Faltenbalg Typ hat:

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

und MyClass Init-Methode wie unten:

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

Frage

Ich habe init-Methode wie unten verwendet, aber immer Fehler erhalten (Fehler Inhalt wird nicht angezeigt, weil ich ein Framework verwende). bitte zeigen Sie mir was fehlt.

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

Was ist Ihre Fehlerausgabe? – nynohu

Antwort

1

Eine Reihe von Dingen falsch mit diesem Code:

  1. Sie können keine Funktionszeiger und Methodenzeiger miteinander vermischen. Es läuft darauf hinaus, dass das this für eine Methode in die Methodenaufrufsignatur einbezogen werden muss. Da der Funktionszeiger den Zeiger this nicht enthält (es ist eine Funktion, kein Methodenzeiger), können die beiden nicht übereinstimmen.

    Die meisten C-basierten API enthält eine Art von Referenzwert (die meisten Frameworks nennen diese refCon, Kontext oder userData), also können Sie eine Adapterfunktion erstellen, die Ihre Methode aufruft. Der Parameter userData in Ihrer CustomType-Parameterliste sieht so aus, als wäre er einer davon (konsultieren Sie die Dokumentation, um sicher zu sein).

    Sie können wahrscheinlich ein userData dort angeben, wo Sie MyClass_Init als Callback festgelegt haben. Also, wenn diese Funktion einen Rückruf in die Bibliothek zu schaffen, wurde set_callback(MyCustomType callback, void* userData) genannt, nicht so etwas wie

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

    mit einer Adapterfunktion wie:

    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. Die malloc(sizeof(void*)) Aussagen aussehen wie Sie Rückkehr sind Missverständnis Parameter (von einigen Lehrern auch "Nebenwirkungen" genannt). Ich habe nicht die Dokumente zu welcher API/Bibliothek, die Sie verwenden, aber ich bin ziemlich sicher, dass Sie Puffer nicht in der Größe eines Zeigers übergeben sollen. Entweder stellen Sie einfach einen Zeiger auf den Stapel bereit, in dem ein Puffer zurückgegeben wird, oder Sie stellen einen ganzen Puffer (z. B. ein Array) und seine Größe bereit, und an diesen Punkt wird der Rückruf schreiben.