2015-02-12 16 views
5

Ich muss eine Wrapper-Klasse in Ziel C für C++ - Klasse schreiben.Wie schreibe ich objective c Wrapper für C++ - Methoden?

Ich habe die folgenden Can't find standard C++ includes when using C++ class in Cocoa project verwiesen und war in der Lage, das lexikalische oder Präprozessorproblem loszuwerden: Problem 'vector' Datei nicht gefunden.

Allerdings verstehe ich nicht, eine C++ - Methoden zu konvertieren, die mehrere Parameter zu objektiven c-Methode akzeptieren.

Kann mir bitte jemand helfen? Was ich tun mag, ist eine Wrapper-Klasse für diesen Ich habe http://breakfastquay.com/rubberband/code-doc/classRubberBand_1_1RubberBandStretcher.html#a0af91755d71eecfce5781f2cd759db85

zu schreiben versucht, dies zu tun und folgenden ist die Methode, die ich mit steckte ...

// 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#>) 
} 
+1

Ich denke, Sie werden nicht besondere erstellen müssen Wrapper-Klasse für C++ in Objective-C. Ändern Sie einfach die Implementierungsdateierweiterung von .m in .mm Ihr C++ - Code beginnt mit der Kompilierung und Ausführung. – Tirth

+0

Ich habe die statische Bibliothek für Rubberband-Bibliothek erstellt und nur die RubberBandStretcher.h-Datei erhalten. Die Header-Datei ist in C++ geschrieben. Wenn ich die Header-Datei importiere, geht es in die Header-Datei und gibt mir den Fehler "lexical or Preprocessor issue: 'vector' Datei nicht gefunden". Ich habe den folgenden Fehler beseitigt http://stackoverflow.com/questions/6083764/cant-find-standard-c-includes-when-using-c-class-in-cocoa-project So denke ich ich müssen Sie einen Wrapper schreiben – Ankahathara

+0

Sie können die Dateierweiterung in. mm ändern, in dem Sie die C++ Syntax verwenden, richtig? Dann brauchen Sie den Wrapper nicht zu korrigieren. – Arjuna

Antwort

4

Sie sollten auf "Übersetzungseinheiten" nachlesen. Kurz gesagt, es gibt keine Möglichkeit zu sagen, in welcher Sprache eine Header-Datei für den Compiler geschrieben ist. Daher wird immer die Sprache der Quelldatei verwendet, die den Header enthält. Wenn Sie also einen C++ - Header aus einer Datei .m einfügen, wird es nicht funktionieren. Für jede ObjC-Datei, die eine C++ - Header verwendet, müssen Sie das Dateinamensuffix der Quelldatei ändern, verwendet es von .m bis .mm. Sie benötigen die Quelldateien für Ihre Rubberband-Bibliothek nicht, Sie müssen lediglich alle Dateien erstellen, die ObjC++ anstelle von ObjC verwenden.

Natürlich möchten Sie möglicherweise nicht alle Ihre Dateien zu ObjC++ ändern. Ihr Code für den alternativen Ansatz des C++ - Wrappers ist ziemlich nah. Eine Sache, die ich bemerkte, ist, dass Sie immer noch die <#foo#> Platzhalter in Ihrem Code haben (Xcode kann sie als blau gerundete Kartuschen anzeigen, was wahrscheinlich ist, warum Sie sie vorher nicht bemerkt haben). Ersetzen Sie diese mit den tatsächlichen Namen der Parametervariablen, genau wie bei einem normalen C-Funktionsaufruf, und alle sollten kompilieren. D.h .:

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

Beachten Sie auch, dass Sie das Semikolon nach dem process Aufruf ausgelassen zu haben scheinen.

BTW, können Sie auch von static_cast mit loszuwerden überall zu verwenden, finden Sie in den hier aufgeführten Tricks: Can I separate C++ main function and classes from Objective-C and/or C routines at compile and link? und es könnte auch einige weitere nützliche Informationen sein hier: How to call C++ method from Objective-C Cocoa Interface using Objective-C++