Mischen von Objective-C und C ++
Ich versuche zu mischen, Objective-C mit C++. Wenn ich den code kompilieren, bekomme ich mehrere Fehler.
A. h
#import <Cocoa/Cocoa.h>
#include "B.h"
@interface A : NSView {
B *b;
}
-(void) setB: (B *) theB;
@end
A. m
#import "A.h"
@implementation A
- (id)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
if (self) {
//Initialization code here.
}
return self;
}
- (void)drawRect:(NSRect)dirtyRect {
//Drawing code here.
}
-(void) setB: (B *) theB {
b = theB;
}
@end
B. h
#include <iostream>
class B {
B() {
std::cout << "Hello from C++";
}
};
Hier sind die Fehler:
/Users/helixed/Desktop/Example/B.h:1:0 /Users/helixed/Desktop/Example/B.h:1:20: error: iostream: No such file or directory
/Users/helixed/Desktop/Example/B.h:3:0 /Users/helixed/Desktop/Example/B.h:3: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'B'
/Users/helixed/Desktop/Example/A.h:5:0 /Users/helixed/Desktop/Example/A.h:5: error: expected specifier-qualifier-list before 'B'
/Users/helixed/Desktop/Example/A.h:8:0 /Users/helixed/Desktop/Example/A.h:8: error: expected ')' before 'B'
/Users/helixed/Desktop/Example/A.m:26:0 /Users/helixed/Desktop/Example/A.m:26: error: expected ')' before 'B'
/Users/helixed/Desktop/Example/A.m:27:0 /Users/helixed/Desktop/Example/A.m:27: error: 'b' undeclared (first use in this function)
InformationsquelleAutor der Frage LandonSchropp | 2010-04-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie name, Ihre .m Dateien .mm. Und Sie werden in der Lage sein zu kompilieren von C++ - code mit Objective-C.
So, nach Ihrem Beispiel, Ihre AView.m - Datei sollte den Namen " AView.mm. Es ist einfach so. Es funktioniert sehr gut. Ich benutze eine Menge von std-Container (std::vector, std::queue, etc) und legacy-C++ - code in iPhone-Projekte ohne irgendwelche Komplikationen.
InformationsquelleAutor der Antwort Pablo Santa Cruz
Nie Verstand, fühle ich mich dumm. Alles, was Sie tun müssen ist, benennen Sie AView.m zu AView.mm, damit der compiler weiß, dass es Objective-C++, und es kompiliert ohne Probleme.
InformationsquelleAutor der Antwort LandonSchropp
konnte Sie halten die Oberfläche Reiniger mit vorwärts-Deklaration von C++ - Klassen:
InformationsquelleAutor der Antwort Leonardo
Stieß ich auf diesen Artikel, der helfen könnte.
Mischen von Objective-C, C++ und Objective-C++
InformationsquelleAutor der Antwort Peter Shaw
Bin ich teilen einige der Punkte, die ich verstanden zu diesem Thema.
Wir mischen kann .cpp und .m-Dateien mit einer reinen C-Schnittstelle. Wie wir wissen, die Clang-compiler unterstützt C++, Objective-C-als auch Objective C++, vielleicht wäre es besser, bedeutet für die Vermischung dieser Sprachen.
Eine Sache, wenn die Vermischung dieser Sprachen gepflegt werden, ist die Verwendung der header-Dateien. Wir halten die C++ aus unserer Objective-C-Headern durch die Erklärung der Cpp-Objekte in der Klasse Erweiterungen.
Alternativ können wir erklären, die cpp-Objekte beim start der @implementation-block in unsere Ziel-Cpp - (.mm) - Datei.
Verwaltung der Speicher wird ein Problem, wenn wir es mit Cpp-Objekte. Wir reservieren kann, memmory für ein Objekt mit " new " und geben den Speicher durch Aufruf von 'Objekt löschen'. Normalerweise, wenn wir über ARC, wir müssen nicht bewusst sein, dass die Freigabe der Speicher für ein Objekt.
Während der Verwendung des cpp-Klassen, wir können erklären, eine Cpp-Objekt auf zwei Arten sagen CppWrapper wrapper und CppWrapper *wrapper, wo CppWrapper ist eine Cpp-Klasse. Wenn wir mit dem letzteren, der Programmierer ist verantwortlich für die Verwaltung der memmory.
Einer anderen Hauptsache ist, dass wenn wir anrufen, eine objective-C-Methode mit Parameter übergeben wir die Verweise, während in cpp, die wir brauchen, um die übergabe der Parameter per Referenz mit dem '&' - Schlüsselwort ist, ansonsten Kopie des Objekts übergeben wurde.
Freigabe von Objective-C-Objekt behandelt wird, zur Laufzeit, wo beim 'löschen' aufgerufen wird, um eine Cpp-Objekt, es wird nicht länger im Gedächtnis bleibt.
Beim schreiben von Cpp, die wir geteilt haben, Zeiger und schwache Zeiger, die ähnlich wie die starken und schwachen der in Ziel C.
http://philjordan.eu/article/mixing-objective-c-c++und objective-c++
http://www.raywenderlich.com/62989/introduction-c-ios-developers-part-1
InformationsquelleAutor der Antwort iGo
In Situationen, wo Sie wollen, um die Einführung eines einfachen C++ - Funktion wie
std::cout <<
dann Hot Licks bietet eine gute alternative.Ändern Sie die "
Identity and Type
" Aus:Objective-C source
:Objective-C++ source
Den .mm Verlängerung einfach identifiziert den Dateityp, und dann Sie suchen eine Objective-C++ nicht eine Objective-C Typ.
InformationsquelleAutor der Antwort Gabe Rainbow