Mélanger Objective-C et C ++

J’essaie de mélanger Objective-C avec C ++. Lorsque je comstack le code, je reçois plusieurs erreurs.

Ah

#import  #include "Bh" @interface A : NSView { B *b; } -(void) setB: (B *) theB; @end 

Un m

 #import "Ah" @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 

Bh

 #include  class B { B() { std::cout << "Hello from C++"; } }; 

Voici les erreurs:

 /Users/helixed/Desktop/Example/Bh:1:0 /Users/helixed/Desktop/Example/Bh:1:20: error: iostream: No such file or directory /Users/helixed/Desktop/Example/Bh:3:0 /Users/helixed/Desktop/Example/Bh:3: error: expected '=', ',', ';', 'asm' or '__atsortingbute__' before 'B' /Users/helixed/Desktop/Example/Ah:5:0 /Users/helixed/Desktop/Example/Ah:5: error: expected specifier-qualifier-list before 'B' /Users/helixed/Desktop/Example/Ah:8:0 /Users/helixed/Desktop/Example/Ah:8: error: expected ')' before 'B' /Users/helixed/Desktop/Example/Am:26:0 /Users/helixed/Desktop/Example/Am:26: error: expected ')' before 'B' /Users/helixed/Desktop/Example/Am:27:0 /Users/helixed/Desktop/Example/Am:27: error: 'b' undeclared (first use in this function) 

Vous devez nommer vos fichiers .m .mm . Et vous pourrez comstackr du code C ++ avec Objective-C.

Donc, suivant votre exemple, votre fichier AView.m devrait s’appeler AView.mm . C’est simple comme ça. Il fonctionne très bien. J’utilise beaucoup de conteneurs std (std :: vector, std :: queue, etc.) et du code C ++ hérité dans les projets iPhone sans aucune complication.

Peu importe, je me sens stupide. Tout ce que vous avez à faire est de renommer AView.m en AView.mm pour que le compilateur connaisse Objective-C ++, et il comstack sans problème.

Vous pouvez garder l’interface plus propre avec la déclaration en avant des classes C ++:

 #import  class DBManager; // This is a C++ class. NOTE: not @class @interface AppDelegate : UIResponder  { DBManager* db; ... } 

Je suis tombé sur cet article qui pourrait aider. Mixage Objective-C, C ++ et Objective-C ++

Je partage certains des points que j’ai compris sur ce sujet.

Nous pouvons mélanger les fichiers .cpp et .m avec une interface C pure. Comme nous soaps que le compilateur Clang supportera C ++, Objective C ainsi que Objective C ++, cela pourrait être un meilleur moyen de mélanger ces langages.

Une chose lors du mélange de ces langages à prendre en compte est l’utilisation des fichiers d’en-tête. Nous pouvons garder le C ++ hors de nos en-têtes Objective C en déclarant les objects Cpp dans les extensions de classe.

Sinon, nous pouvons déclarer les objects cpp juste au début du bloc @implementation dans notre fichier Objective Cpp (.mm).

La gestion de la mémoire sera un problème lorsque nous traitons avec des objects Cpp. Nous pouvons allouer memmory à un object en utilisant ‘new’ et libérer la mémoire en appelant ‘delete object’. Normalement, si nous utilisons ARC, nous n’avons pas besoin de connaître la libération de la mémoire pour un object.

Lors de l’utilisation des classes cpp, nous pouvons déclarer un object Cpp de deux manières, à savoir: CppWrapper wrapper et CppWrapper * wrapper, où CppWrapper est une classe Cpp. Lorsque nous utilisons ce dernier, le programmeur est responsable de la gestion de la mémoire.

Une autre chose importante est que lorsque nous appelons une méthode d’objective C avec des parameters, nous passons les références, alors que dans cpp nous devons passer les parameters par référence en utilisant le mot clé ‘&’, sinon la copie de l’object est passée.

La désallocation de l’object Objective C est gérée au moment de l’exécution, où lorsque «delete» est appelé pour un object Cpp, il ne rest plus dans la mémoire.

En écrivant Cpp, nous avons partagé des pointeurs et des pointeurs faibles qui sont similaires aux forts et faibles de l’objective C.

http://philjordan.eu/article/mixing-objective-c-c++-and-objective-c++ http://www.raywenderlich.com/62989/introduction-c-ios-developers-part-1

Dans les situations où vous souhaitez introduire une simple fonction C ++ comme std::cout << Hot Licks offre une bonne alternative.

Modifier le " Identity and Type " De: Objective-C source Pour: Objective-C source Objective-C++ source

L'extension .mm identifie simplement le type de fichier; et vous recherchez alors un type Objective-C ++ pas Objective-C.