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
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();
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];
}
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];
}
- 1. el futuro del objetivo c?
- 2. Selectores en el objetivo C
- 3. pi en el objetivo C
- 4. __OBJC__ en el objetivo C
- 5. epub en el objetivo c
- 6. constructor en el objetivo c
- 7. Caret en el objetivo C
- 8. Constante en objetivo-c
- 9. urldecode en objetivo-c
- 10. Compilar C# en el objetivo-C
- 11. IDE para el objetivo C
- 12. Objetivo C. sintaxis extraño
- 13. C Objetivo: Modulo sesgo
- 14. Objetivo C Introspección/Reflexión
- 15. Uso de extern en el objetivo C
- 16. Carga lenta en el objetivo C
- 17. Múltiples delegados en el objetivo C
- 18. Método de sintaxis en el objetivo C
- 19. Mezcla C y objetivo-C
- 20. Comparación de caracteres Unicode del objetivo C
- 21. objetivo-c - variables globales
- 22. Objetivo-C - Símbolos indefinidos
- 23. tipo Clase C Objetivo
- 24. Objetivo C Boolean Array
- 25. Objetivo C - Clase KeyValuePair?
- 26. Objetivo C: Delegados múltiples
- 27. Agregar componentes a la ruta - Objetivo C
- 28. Verificar inf - objetivo c
- 29. objetivo c constantes clase
- 30. Objetivo C "#if" sintaxis