Ich habe gegoogelt und ich finde eine Million Ergebnisse zu diesem Thema. Aber keine der Seiten hilft mir. Ich denke, dass ich ein sehr häufiges Problem habe. Ich experimentiere mit Audioprogrammen, insbesondere mit Audio-Warteschlangen. Der Zweck meines Programms spielt keine Rolle für die Erklärung des Problems. Aber kurz gesagt: Ich bekomme einen Fehler, wenn ich versuche, eine objective-c-Funktion aus C ++ - Code aufzurufen. Also hier ist mein Code, der den Fehler enthält: AudioRecorder.h:
%Vor%Und das ist die Implementierung: AudioRecorder.mm:
%Vor%Wenn ich "[self playAlarmSound];" weglasse dann funktioniert alles gut. Wie kann ich diese Objective-C-Funktion aus meinem C ++ - Code aufrufen?
self
existiert nur in Objective-C-Methoden und das ist eine C-Style-Funktion. Sie müssen self
von einer Objective-C-Methode an die inUserData übergeben, wenn Sie den Callback einrichten, und ihn dann auf den richtigen Typ zurückwerfen.
Und Ihre ursprüngliche Implementierung
%Vor% Das ist in der Tat ein häufiges Problem. self
funktioniert hier nicht, weil dies keine Methode der Klasse AudioRecorder
ist, nicht weil es Objective-C-Code ist. Sie befinden sich in einer Objective-C ++ - Datei, daher funktioniert der gesamte gültige Objective-C-Code. [anAudioRecorder playAlarmSound]
funktioniert gut, vorausgesetzt, Sie haben eine gute Referenz auf anAudioRecorder
.
Wie erhalten wir eine Referenz, wenn wir keinen Zugriff auf self
haben? Der übliche Weg besteht darin, das Argument void* aqData
dieser Funktion als Zeiger auf Ihr Objekt AudioRecorder
zu verwenden. Wenn Sie diesen Rückruf registriert haben, haben Sie ihm gesagt, was das Argument void*
wäre, in diesem Fall ein Zeiger auf Ihr Objekt AQRecorderState
oder struct, das Sie sowieso nicht zu benutzen scheinen. Stattdessen können Sie bei der Registrierung einen Zeiger auf self
verwenden, damit Sie dieses Objekt hier verwenden können.
Eine andere Option wäre die Verwendung eines gemeinsamen Objekts AudioRecorder
. In diesem Fall würden Sie etwas wie [AudioRecorder sharedInstance]
(eine Klasse, keine Instanz, Methode) aufrufen, um das gewünschte Objekt AudioRecorder
zu erhalten. Da die andere Antwort hier die erste Methode beschreibt, wird hier die Verwendung der Option shared instance beschrieben: Fügen Sie eine statische Instanz von AudioRecorder
und eine Klassenmethode sharedInstance
zu Ihrem AudioRecorder
-Objekt hinzu, wie folgt:
Wenn Sie dann AudioRecorder
von Ihrem Rückruf verwenden möchten, können Sie die gemeinsam genutzte Instanz mit [AudioRecorder sharedInstance]
abrufen. Dies ist ein sehr nützliches Paradigma, wenn es nur ein AudioRecorder
gibt - es eliminiert eine Menge von Referenzübergaben.
Tags und Links objective-c c++ call