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:
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
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.
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.
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
:
Verwenden Sie in jeder Header-Datei ( .h
), in der Sie auf LLAHProcessorWrapper
verweisen möchten, anstelle von Imports auch Weiterleitungsklassendefinitionen:
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.
Tags und Links objective-c c++ iphone xcode stl