2010-10-23 6 views
4

Est-il possible d'avoir un membre objectif de c dans une classe C++membre Objective C en C++ classe

@interface ObjectiveCClass : UIViewController { 

    int someVarialbe; 

} 
- (void)someFunction; 

@end 


class CPlusPlusClass{ 
     ObjectiveCClass obj;   // have a objective c member 

     void doSomething(){ 
      obj.someFunction;  // and call a objective c method 
     } 
}; 

Toute orientation serait vraiment appréciée.

Vive

Répondre

6

Pour créer des fichiers d'en-tête qui peuvent être partagées entre obj-c et le code de cpp, vous pouvez utiliser le compilateur de macros prédéfinies pour faire quelque chose comme:

// A .h file defining a objc class and a paired cpp class 
// The implementation for both the objective C class and CPP class 
// MUST be in a paired .mm file 
#pragma once 

#ifdef __OBJC__ 
#import <CoreFoundation/CoreFoundation.h> 
#else 
#include <objc/objc.h> 
#endif 

#ifdef __OBJC__ 

@interface ObjectiveCClass : 
... 

typedef ObjectiveCClass* ObjectiveCClassRef; 

#else 

typedef id ObjectiveCClassRef; 

#endif 

#ifdef __cplusplus 

class CPlusPlusClass { 
    ObjectiveCClassRef obj; 

    void doSomethind(); 
}; 

#endif 

Je ne suis pas sûr à 100% sa Légal pour avoir ObjectiveCClassRef changer le type comme celui entre c/cpp et les constructions d'obj-c. Mais id est un type compatible c/cpp défini dans les fichiers d'en-tête C comme capable de stocker un pointeur de classe C objectif et, lorsqu'il est utilisé dans les fichiers .m ou .mm, vous permet d'appeler directement l'objet.

+0

Quand je l'ajoute #include "ObjectiveCClass.h" au C++ fichier je reçois des erreurs 9000, comme: attendu-id non qualifiée avant '-' jeton et Stray '@' dans le programme – user346443

+1

En-tête Les fichiers qui vont être partagés entre les fichiers .cc/.cpp et/mm doivent être nettoyés. Vous ne pouvez utiliser aucune directive objective-Cs @ dans un tel fichier d'en-tête. –

+0

Alors qu'est-ce qu'une classe objective-c doit ressembler donc je peux en avoir un membre dans une classe C++. Merci de votre aide. – user346443

2

Il existe un dialecte d'Objective-C appelé Objective-C++ interopérable avec C++ de la même manière que Objective-C est interopérable avec C. Vous pouvez changer le paramètre pour que le fichier soit Objective-C++ ou changer l'extension à ".mm". Vous aurez toujours besoin d'accéder à des objets Objective-C via des pointeurs et faire la danse alloc-init et tout ça, bien sûr.