11
votes

Écrire un wrapper C ++ autour de l'objectif-c

Je veux appeler et travailler avec des classes de l'objectif-C à partir d'un projet C ++ sur OS X. Il est temps de commencer à se déplacer vers tous les objectifs-C, mais nous devons le faire sur quelque temps.

Comment va-t-il accomplir cela? Quelqu'un peut-il perdre une lumière et donner un exemple?


4 commentaires

Essayez-vous d'appeler des objets de fondation (non-UI) ou d'objets AppKit (UI)? Appelez-vous nsaplicationMain () dans principal () ou essayez-vous d'éviter cela?


Dupliqué possible de Calling Objective-C méthode de la méthode C ++?


Il existe une balise Objective-C ++ sur afin que vous puissiez vérifier également. Stackoverflow.com/questions/tagged/Objective-c++


@ROB Napier - Kit de fondation et d'application. Appels de fichier de fichiers et boîtes de dialogue pour ouvrir des fichiers, sauvegarder, alertes, etc.


4 Réponses :



8
votes

Objective-C ++ est un superset de C ++ , tout comme l'objectif-c est un superset de C. Il est pris en charge par les compilateurs de GCC et de Clang sur OS X et vous permet d'instancier et d'appeler des objets et des méthodes d'Objective-C à partir de C ++. Tant que vous masquez les importations d'en-tête Objective-C et les types dans la mise en place d'un module C ++, il ne infectera aucun de votre code "pur" C ++.

.mm code> est la valeur par défaut Extension pour Objective-C ++. Xcode fera automatiquement la bonne chose. P>

Donc, par exemple, la classe C ++ suivante renvoie les secondes depuis le 1er janvier. 1970: P>

//MyClass.h

class MyClass
{
  public:
    double secondsSince1970();
};

//MyClass.mm

#include "MyClass.h"
#import <Foundation/Foundation.h>

double MyClass::secondsSince1970()
{
  return [[NSDate date] timeIntervalSince1970];
}

//Client.cpp

...
MyClass c;
double seconds = c.secondsSince1970();


0 commentaires

3
votes

Renommez d'abord vos fichiers de * .m à * .mm afin que vous obteniez Objective-C ++

Je n'ai pas fatigué cela, c'est donc la spéculation (je le ferai ce soir): p>

comme tout objectif -C ++ objets (qui sont comptés en référence) sont contrôlés via des pointeurs afin que vous puissiez écrire un destructeur spécial pour un pointeur partagé. P>

// FuncFile.M
//
int func()
{
    boost::shared_ptr<MyX, ObjCDestruct<MyX> >  data([[MyX alloc] init]);

    [data.get() doAction1:@"HI"];
}


1 commentaires

Si vous vouliez être extra-snazzzy, vous subglassez type_traits pour is_objc_obj et spécialisez-vous à ce sujet;)