[Objectiv-C++] Frage zu Funktion als Parameter



  • Hallo. Ich entwickle gerade ein Programm per Open iOS SDK mit Objective-C++. Hierbei verwende ich eine externe Funktion eines SDK Frameworks, bei dem eine Callback-Funktion als Parameter übergeben werden muss:

    extern "C" void CTTelephonyCenterAddObserver(id,id,CFNotificationCallback,NSString*,void*,int);
    extern "C" id CTTelephonyCenterGetDefault();
    
    void ATSTelephonyObserver::callback(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo)
    {
    ...
    }
    
    ATSTelephonyObserver::ATSTelephonyObserver() {
        id ct = CTTelephonyCenterGetDefault();
        CTTelephonyCenterAddObserver(ct, NULL, ATSTelephonyObserver::callback, NULL, NULL, CFNotificationSuspensionBehaviorHold);
    }
    

    Meine Frage bezieht sich auf den Parameter CFNotificationCallback der Funktion CTTelephonyCenterAddObserver. Er hat die Typendefinition:

    typedef void (*CFNotificationCallback)(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo);
    

    Der Code compiliert zwar und auch das Programm läuft, aber es funktioniert nur wenn ATSTelephonyObserver::callback als statische klassenfunktion deklariert oder nicht teil von ATSTelephonyObserver ist. Meine Frage ist nun... geht das auch irgendwie anders? Geht das nicht nicht irgendwie, dass man eine Member-funktion als parameter übergibt?
    Das Problem an der statischen Funktion ist nämlich, dass man aus ihr heraus nicht auf nicht-statische Klassenatribute zugreifen kann. Oder sehe ich da was falsch?

    gruß, Phill



  • Soahc schrieb:

    aber es funktioniert nur wenn ATSTelephonyObserver::callback als statische klassenfunktion deklariert oder nicht teil von ATSTelephonyObserver ist. Meine Frage ist nun... geht das auch irgendwie anders?

    Nein.

    Das Problem an der statischen Funktion ist nämlich, dass man aus ihr heraus nicht auf nicht-statische Klassenatribute zugreifen kann. Oder sehe ich da was falsch?

    Vermutlich kann man den Zeiger auf das Objekt separat übergeben. Der eine void-Pointer-Parameter heißt object, das wäre ein ganz heißer Kandidat. Ohne Dokumentation kann ich das aber nicht genau sagen.



  • Sorry, ich habe hier gerade versehentlich einen Post von Soahc gelöscht, in dem im wesentlichen zu lesen war, dass es sich um eine undokumentierte Funktion handelt, er aber ausprobieren wird, ob man nicht wirklich einen Objektpointer separat übergeben kann.

    Tut mir leid, war etwas unaufmerksam.



  • + natürlich ein Dankeschön an Bashar für den Tip. Ob es nun so gedacht ist, oder nicht, es lässt sich tatsächlich ein pointer auf die instance übergeben und dann darauf zugreifen...


Log in to reply