44 votes

Mélanger Objective-C et C ++

J'essaie de mélanger Objective-C avec C ++. Lorsque je compile le code, plusieurs erreurs se produisent.

Ah

 #import <Cocoa/Cocoa.h>
#include "B.h"

@interface A : NSView {
    B *b;
}

-(void) setB: (B *) theB;

@end
 

Un 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
 

Bh

 #include <iostream>

class B {

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

};
 

Voici les erreurs:

 /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)
 

77voto

Pablo Santa Cruz Points 73944

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

Ainsi, à la suite de votre exemple, votre fichier AView.m doit 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.

5voto

LandonSchropp Points 3103

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

2voto

Leonardo Points 21

vous pouvez garder l'interface plus propre avec la déclaration en aval des classes C ++:

 #import <AnObjCclass.h>
class DBManager; // This is a C++ class. NOTE: not @class

@interface AppDelegate : UIResponder <UIApplicationDelegate,
                                    CLLocationManagerDelegate,
                                    MFMailComposeViewControllerDelegate>
{
    DBManager* db;
...
}
 

2voto

Peter Shaw Points 1

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

1voto

Govind P N Points 1016

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

On peut mélanger les deux .rpc et .m les fichiers avec une pure C de l'interface. Comme nous le savons, le Cliquetis compilateur C++, Objective-C et de l'Objective-C++, il pourrait être un meilleur moyen pour le mélange de ces langues.

Une chose lors du mélange de ces langues pour être pris en charge est d'utiliser les fichiers d'en-tête. Nous pouvons garder le C++ de notre Objectif C-têtes en déclarant la Rpc objets dans les extensions de la classe.

Sinon, nous pouvons déclarer la rpc objets juste au début de @mise en œuvre de bloc dans notre Objectif de la Rpc.mm) fichier.

Gestion de la mémoire sera une source de préoccupation lorsque nous traitons avec le Rpc, les objets. Nous pouvons allouer memmory pour un objet à l'aide de "nouvelles" et de libérer de la mémoire en appelant "supprimer l'objet". Normalement, si nous sommes à l'aide de l'ARC, nous avons besoin de ne pas être au courant de libération de la mémoire pour un objet.

Lors de l'utilisation du rpc classes, nous pouvons déclarer une Rpc objet de deux manières dire CppWrapper wrapper et CppWrapper *wrapper où CppWrapper est un Cpp de la classe. Lorsque nous sommes à l'aide de ce dernier, le programmeur est responsable de la gestion de la memmory.

Une autre chose principale est que lorsque nous sommes à l'appel d'une méthode objective C avec des paramètres, nous passons les références, tandis que dans le rpc, nous avons besoin de passer des paramètres par référence en utilisant le ‘&' mot-clé, sinon la copie de l'objet est passé.

La libération de l'Objectif C de l'objet est traité au moment de l'exécution, où, quand "supprimer" est invoquée pour un Rpc de l'objet, il ne reste plus dans la mémoire.

Lors de l'écriture du Rpc, nous avons partagé de pointeur et de la faiblesse des pointeurs qui est similaire à la forte et faible en Objective C.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X