Empfohlene Methode zur Verwendung der C ++ - Klasse in der Objective-C-Klasse, die die Verwendung von Objective-C ++ minimiert?

7

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.

    
Eonil 27.03.2011, 10:50
quelle

2 Antworten

15

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.

    
pmdj 27.03.2011, 10:56
quelle
4

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.

    
DuncanSungWKim 02.10.2012 06:40
quelle