Ich mische Objective-C und C ++. Ich möchte jedoch die Verwendung von Objective-C ++ minimieren. Weil es sowohl in Objective-C als auch in C ++ gewisse Grenzen hat.
Momentan benutze ich es so.
%Vor% Ich möchte C.h
in B.h
einfügen, aber wenn ich es getan habe, kann B.h
nicht in A.h
importiert werden. Also muss ich die Variable c
als void*
type belassen. Das ist kein großes Problem, da ich Mitglieder von C
in B.m
file frei verwenden kann. Aber ich muss es immer werfen. Das fühlt sich etwas unklar an. Ich möchte also einen besseren Weg benutzen, wenn es so ist.
Es gibt mehrere Möglichkeiten, dies zu tun, aber meiner Meinung nach ist die beste Methode, das "PIMPL" -Idiom , was in C ++ ziemlich häufig ist. Machen Sie die Header zu reinem Objective-C und reinem C ++ mit Zeigern zu einer forward-deklarierten Struktur, die die eigentliche Implementierung enthält. Dies ist in der .mm-Datei definiert und kann dann Objective-C ++ verwenden.
In Ihrem Beispiel würden Sie so etwas tun:
%Vor% Ich habe tatsächlich einen Artikel über die Lösung genau dieses Problems geschrieben, Sie könnten es nützlich finden: Ссылка - es zeigt auch einige andere Möglichkeiten, dies zu tun, einschließlich Ihrer ursprünglichen void*
-Ansatz.
Wie pmjordan in in seinem Blog-Artikel schrieb, Die Deklaration der Schnittstelle benötigt das Schlüsselwort 'struct' wie folgt:
%Vor%Ich glaube, er hat das versehentlich ausgelassen. Falls Sie diesen Header hinzufügen müssen, wenn Sie viele * .m-Dateien haben, macht dies einen großen Unterschied. Das hinzugefügte Schlüsselwort 'struct' bewirkt, dass der Objective-C-Compiler diesen Header als reines C für andere .m-Dateien versteht, die diesen Header importieren. Andernfalls werden andere * .m-Dateien, die diesen Header importieren, nicht kompiliert. Diese kleine Lösung erspart Ihnen das Ändern der * .m-Dateien in .mm-Dateien. Wenn Sie die ursprünglichen .m-Dateien in .mm-Dateien ändern, führt dies manchmal zu vielen Kompilierungsfehlern.
Tags und Links objective-c c++ objective-c++ mixing