Erstellen eines Objective-C-Wrappers für eine C ++ - Bibliothek

8

Ich versuche, einen Wrapper in Objective-C zu erstellen, damit ich C ++ nicht außerhalb der Bibliotheksklassen schreiben muss.

Die Hauptdatei der Bibliothek lautet LLAHProcessor.h .cpp

Mein Wrapper ist LLAHProcessorWrapper.h .mm

Es kompiliert gut, aber wenn ich LLAHProcessorWrapper zu einer anderen Klasse hinzufüge, (sagen wir eine UIView) als eine Mitgliedsvariable, bekomme ich Hunderte von Fehlern, wie:

%Vor%

und in jeder c ++ Klasse / struct:

%Vor%

Ist wie der Compiler C ++ - Code nicht erkennt.

Ich frage mich, was ich hier vermisse. Muss es etwas mit der Tatsache sein, dass ich das zu Xcode Target Properties hinzugefügt habe:?

%Vor%

Oder vielleicht muss ich hier neue Flags hinzufügen?

Vielen Dank im Voraus

    
nacho4d 17.11.2010, 12:17
quelle

3 Antworten

6

Ihr Problem besteht darin, dass .m -Dateien als C anstelle von C ++ kompiliert werden. Wenn also der Compiler während der Kompilierung einer .m -Datei auf irgendein C ++ selbst in einer Header-Datei stößt, wird es barf.

Zweifellos müssen Sie C ++ in Ihre Header-Datei schreiben, weil Ihr Objective-C-Objekt ein C ++ - Objekt umschließt, aber es gibt verschiedene Möglichkeiten. Eine Möglichkeit wäre, einen Zeiger auf das C ++ - Objekt zu verwenden und den handlichen Präprozessor define __cplusplus zu verwenden, der für C ++ (und Objective-C ++) definiert ist, jedoch nicht für C (oder Objective-C), z.B.

%Vor%

Da Sie niemals die Mitglieder des cppObject außerhalb der .mm -Deferenz dereferenzieren, spielt es keine Rolle, dass Sie niemals eine vollständige Definition für die Struktur angeben.

Sie würden new und delete den Zeiger in -init bzw. -dealloc angeben. Sie würden die vollständige C ++ - Klassendeklaration in LLAHProcessorWrapper.mm einschließen.

    
JeremyP 17.11.2010, 14:48
quelle
4

Alles, was Sie tun müssen, ist ein .mm zu erstellen, wie Sie es getan haben, und der Compiler sollte sich um alles kümmern.

Der Cayat ist, dass es nicht sicher ist, irgendetwas C ++ in den .h -Dateien zu haben, da sie von anderen Objective-C-Dateien importiert werden können und dann alles zusammenbricht. Das Hauptproblem besteht darin, dass Sie C ++ - Typen nicht direkt als Instanzvariablen für Ihre Objective-C-Wrapperklasse definieren können, es sei denn, jede einzelne .m -Datei wird als Objective-C ++ .mm -Datei umbenannt.

Die Lösung besteht darin, die Instanzvariablen als void* in der Header-Datei zu definieren und mit dem Typ-Casting aus der Implementierungsdatei darauf zuzugreifen. Die einfachste Lösung hierfür wäre der Zugriff auf die Instanzvariable über eine private Eigenschaft, die für Sie die Typumwandlung ist.

Beispielcode unter der Annahme Foo ist eine C ++ Klasse, die in Foo.h :

definiert ist %Vor%     
PeyloW 17.11.2010 12:47
quelle
0

Verwenden Sie in jeder Header-Datei ( .h ), in der Sie auf LLAHProcessorWrapper verweisen möchten, anstelle von Imports auch Weiterleitungsklassendefinitionen:

%Vor%

und stellen Sie sicher, dass die entsprechende Implementierungsdatei #include LLAHProcessorWrapper.h oder #import LLAHProcessorWrapper.h hat.

Jede Implementierungsdatei, in der Sie #include oder #import Ihre Kopfzeile müssen .mm als Suffix haben, wenn LLAHProcessorWrapper.h oder etwas anderes in der gesamten Include-Struktur eine C ++ Syntax hat alle. Auf diese Weise hat eine .mm -Datei die Tendenz zu bedeuten, dass große Dateien einer Codebasis in .mm umbenannt werden müssen.

    
Josh Bleecher Snyder 17.11.2010 12:47
quelle

Tags und Links