2011-08-20 15 views
6

Tengo una aplicación en C++ escrita con Boost/WXWidgets, dirigida a Windows y Mac OSX. Sin embargo, tengo un problema que no puedo resolver usando estas bibliotecas. Mi solución requiere que complete una clase Objective C para que pueda llamarlo desde uno de mis módulos C++. Mi investigación hasta ahora me dice que necesito usar Objective C++ escrito en archivos fuente con una extensión .mm, lo que permite a XCode tratar el archivo como una mezcla de Objective C y C++. He encontrado muchos artículos que detallan cómo ajustar C++ para que pueda ser llamado desde ObjectiveC, pero nada que dé ningún detalle en el reverso. Cualquier enlace a artículos o, mejor aún, un ejemplo trabajado, sería muy apreciado.Ajuste del objetivo C en el objetivo C++/C++

Respuesta

2

Simplemente mezcle (pero no olvide configurar el grupo). Funciona.

// obj-c code, in .mm file 
void functionContainingObjC(){ 
     NSAutoreleasePool*pool=[[NSAutoreleasePool alloc] init]; 
     [lots of brackets!]; 
     [pool release]; 
} 

// c++ code, in .cc file 
functionContainingObjC(); 
4

Si quieres un reutilizable C++ puro envoltorio alrededor de una clase Objective C, los Pimpl idiom funciona bastante bien. La expresión Pimpl hará que no haya elementos de Objective C/Cocoa visibles en el archivo de encabezado que se incluirán en el código puro de C++.

// FooWrapper.hpp 

// Absolutely no Cocoa includes or types here! 

class FooWrapper 
{ 
public: 
    int bar(); 

private: 
    struct Impl; // Forward declaration 
    Impl* impl; 
}; 


// FooWrapper.mm 

@import "FooWraper.hpp" 
@import "Foundation/NSFoo.h" 

struct FooWrapper::Impl 
{ 
    NSFoo* nsFoo; 
}; 

FooWrapper::FooWrapper() : impl(new Impl) 
{ 
    impl->nsFoo = [[NSFoo alloc] init]; 
} 

FooWrapper::~FooWrapper() 
{ 
    [impl->nsFoo release]; 
    delete impl; 
} 

int FooWrapper::bar() 
{ 
    return [impl->nsFoo getInteger]; 
} 
1

objc proporciona interfaces c para las interfaces básicas y tipos (#include <objc/headers_you_need.h>. Por lo tanto, puede utilizar estas interfaces en pura C/C++ unidades de formación. Continuación, incluir librerías como Fundación o AppKit en el mm y utilizar tipos ObjC y mensajería en la implementación

la siguiente es una interfaz muy básica que no es segura, pero le recomiendo que sea segura para el tipo de objc que está envolviendo. Esto debería ser suficiente para comenzar en la dirección correcta

// .hpp 
namespace MON { 
// could be an auto pointer or a dumb pointer; depending on your needs 
    class t_MONSubclassWrapper { 
    public: 
// usual stuff here... 

// example wrapper usage: 
     void release(); 
    private: 
     id d_objcInstance; 
    }; 
} /* << MON */ 

// .mm 
... 
#include <Foundation/Foundation.h> 

MON::t_MONSubclassWrapper::t_MONSubclassWrapper() : 
    d_objcInstance([[MONSubclass alloc] init]) { 
} 
... 
void MON::t_MONSubclassWrapper::release() { 
    [d_objcInstance release]; 
}