web-dev-qa-db-fra.com

Mélanger Objective-C et C ++

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

A.h

#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

B.h

#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)
43
LandonSchropp

Vous devez nommer vos . M fichiers . Mm. Et vous pourrez compiler du code C++ avec Objective-C.

Donc, suivant votre exemple, votre fichier AView.m doit être nommé AView.mm. C'est aussi simple que ç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.

77
Pablo Santa Cruz

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

5
LandonSchropp

vous pouvez garder l'interface plus propre avec une déclaration directe des classes C++:

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

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

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

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

Une chose lors du mélange de ces langues à 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 objets Cpp dans les extensions de classe.

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

La gestion de la mémoire sera une préoccupation lorsque nous aurons affaire à des objets Cpp. Nous pouvons allouer la mémoire d’un objet en utilisant ‘new’ et libérer la mémoire en appelant ‘delete object’. Normalement, si nous utilisons ARC, nous n'avons pas besoin d'être conscients de libérer la mémoire d'un objet.

Lors de l'utilisation des classes cpp, nous pouvons déclarer un objet Cpp de deux manières, comme le wrapper CppWrapper et le wrapper CppWrapper * 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 principale est que lorsque nous appelons une méthode Objective C avec des paramètres, nous passons les références, tandis que dans cpp, nous devons passer les paramètres par référence en utilisant le mot clé ‘&’, sinon une copie de l’objet est passée.

La désallocation de l’objet Objective C est gérée au moment de l’exécution, où lorsque ‘delete’ est invoqué sur un objet Cpp, il ne reste plus en mémoire.

Lors de l'écriture de Cpp, nous avons partagé un pointeur et des pointeurs faibles qui sont similaires aux forts et faibles de l'objectif C.

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

1
iGo

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

Changer la "Identity and Type" De: Objective-C source À: Objective-C++ source

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

0
Gabe Rainbow