¿Cómo escribir wrapper objective c para methods c ++?

Necesito escribir una class envoltura en el objective c para la class C ++.

He referido lo siguiente: No se puede encontrar el C ++ estándar que se incluye cuando se usa la class C ++ en el proyecto Cocoa y se pudo deshacer del problema léxico o Preprocessor: el file 'vector' no se encontró problema.

Sin embargo, no entiendo que cubra los methods de C ++ que aceptan varios parameters para el método objective c.

¿Puede alguien ayudarme a hacerlo? Lo que quiero hacer es escribir una class envoltura para este http://breakfastquay.com/rubberband/code-doc/classRubberBand_1_1RubberBandStretcher.html#a0af91755d71eecfce5781f2cd759db85

He intentado hacerlo y los seguidores son el método con el que estoy atrapado …

// Wrapper.h #import <Foundation/Foundation.h> @interface Wrapper : NSObject { void *myRubberBandStretcher; } #pragma mark - Member Functions -(void)process:(const float)input samples:(size_t)samples final:(bool)final; @end 

////////////////////////////////////////////////// ///////////////////////////////

 //Wrapper.mm #import "Wrapper.h" #import "RubberBandStretcher.h" @implementation Wrapper -(id)init { self = [super init]; if (self) { myRubberBandStretcher = new RubberBand::RubberBandStretcher::RubberBandStretcher(44100, 2, 0, 1.0, 1.0); } return self; } -(void)process:(const float)input samples:(size_t)samples final:(bool)final { static_cast<RubberBand::RubberBandStretcher *>(myRubberBandStretcher)->process(<#const float *const *input#>, <#size_t samples#>, <#bool final#>) } 

Debería leer sobre "unidades de compilation". En resumen, no hay forma de saber en qué idioma se escribe un file de encabezado para el comstackdor. Por lo tanto, siempre utiliza el idioma del file fuente que incluye el encabezado. Entonces si incluye un encabezado de C ++ de un file .m , no funcionará. Por cada file ObjC que utiliza un encabezado de C ++, debe cambiar el sufijo del nombre de file del file de origen que lo utiliza desde .m a .mm . No necesita los files fuente para su biblioteca de banda de goma, simplemente necesita crear todos los files que lo utilizan ObjC ++ en lugar de solo ObjC.

Por supuesto, es posible que no desee cambiar todos sus files para ser ObjC ++. Su código para el enfoque alternativo de envolver el C ++ está bastante cerca. Una cosa que noté es que aún tiene los <#foo#> marcadores de position en su código (Xcode puede mostrarlos como cartuchos networkingondeados azules, probablemente porque no los haya notado antes). Reemplace esos con los nombres reales de las variables de parameters, tal como lo haría con una llamada de function C normal, y todos deberían comstackr. Es decir:

 -(void)process:(const float)input samples:(size_t)samples final:(bool)final { static_cast<RubberBand::RubberBandStretcher *>(myRubberBandStretcher)->process( input, samples, final ); } 

También tenga en count que parece haber omitido el punto y coma después de la llamada al process .

Por cierto, también puede deshacerse de tener que usar static_cast todas partes, vea los trucos que se enumeran aquí: ¿Puedo separar las funciones principales de C ++ y las classs de las rutinas Objective-C y / C en comstackr y vincular? y también podría haber alguna información más útil aquí: Cómo llamar al método C ++ desde Objective-C Cocoa Interface usando Objective-C ++

Intereting Posts