2010-02-14 10 views
17

Estoy tratando de mezclar C++ y Objective-C, he hecho la mayor parte del camino pero me gustaría tener una única clase de interfaz entre el código Objective-C y C++. Por lo tanto, me gustaría tener un objeto C++ persistente en la interfaz ViewController.Agregar Objeto C++ a Objective-Clase C

Esta falla al prohibir la declaración de 'myCppFile' sin ningún tipo:

#import <UIKit/UIKit.h> 
#import "GLView.h" 
#import "myCppFile.h" 

@interface GLViewController : UIViewController <GLViewDelegate> 
{ 
    myCppFile cppobject; 
} 

@end 

Sin embargo, esto funciona bien en el archivo de implementación .mm (No funciona porque quiero cppobject persista entre llamadas)

#import "myCppFile.h" 
@implementation GLViewController 
- (void)drawView:(UIView *)theView 
{ 
    myCppFile cppobject; 
    cppobject.draw(); 
} 

Respuesta

27

que puedes usar opaque pointers y sólo incluyen C++ encabezados en el archivo que implementa su clase Objective-C. De esa manera no forzar otros archivos que incluyen la cabecera de usar Objective-C++:

// header: 
#import <UIKit/UIKit.h> 
#import "GLView.h" 

struct Opaque; 

@interface GLViewController : UIViewController <GLViewDelegate> 
{ 
    struct Opaque* opaque; 
} 
// ... 
@end 

// source file: 
#import "myCppFile.h" 

struct Opaque { 
    myCppFile cppobject; 
}; 

@implementation GLViewController 
// ... create opaque member on initialization 

- (void)foo 
{ 
    opaque->cppobject.doSomething(); 
} 
@end 
+0

Gracias, las otras sugerencias no parecían funcionar y terminé declarando mi objeto como un "id *" y luego lo fundí en el tipo correcto donde quiera que lo use. Esto parece ser la misma idea, pero es mucho más limpio ya que no tengo que hacer todos los moldes extra. – Winder

+2

Yo siempre preferiría los punteros opacos sobre los moldes; podría ser un poco más trabajo, pero usted recupera la seguridad total. –

+0

He estado jugando con punteros opacos para esto, que utilizo extensivamente para el envoltorio de C/C++, pero hasta ahora no he visto el beneficio real. ¿Puede comparar este estilo (junto con algún código que muestra cómo se asigna y libera "opaco") al estilo basado en void * aquí: http://robnapier.net/blog/wrapping-c-objc-20 –

0

creo que es necesario para establecer el indicador siguiente a true en la configuración del proyecto:

GCC_OBJC_CALL_CXX_CDTORS = YES 

Esto debería permitirle instanciar objetos C++ en sus clases Objective-C.

+0

Esto no parece funcionar. Estoy usando Xcode 3.2.1 y el 3.0 iphone SDK. – Winder

3

Asegúrese de que todos los archivos que incluyen GLViewController.h sean fuentes Objective-C++ (* .mm).

Al incluir código C++ en el encabezado de su controlador de vista, todas las fuentes que importar esta cabecera debe ser capaz de entenderlo, por lo que debe ser en Objective-C++

2

tiene que declarar el C++ objetos en un bloque de interfaz en el archivo de .mm.

En .mm:

#include "SomeCPPclass.h" 

@interface SomeDetailViewController() { 
    SomeCPPclass* _ipcamera; 
} 
@property (strong, nonatomic) UIPopoverController *masterPopoverController; 
- (void)blabla; 
@end 
+0

Toma nota de la() - esa es la magia negra (et) que hace que esto funcione :) – goelectric