2010-02-14 14 views
17

Ich versuche C++ und Objective-C zu mischen, ich habe es größtenteils gemacht, hätte aber gerne eine einzige Interface-Klasse zwischen Objective-C und C++. Daher möchte ich ein persistentes C++ - Objekt in der ViewController-Schnittstelle haben.C++ - Objekt zur Objective-C-Klasse hinzufügen

Dies ohne Typ durch das Verbot der Erklärung von ‚myCppFile‘ versagt:

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

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

@end 

Doch diese ganz gut in der .mm Implementierungsdatei funktioniert (es funktioniert nicht, weil ich cppobject zwischen den Anrufen beharren wollen

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

Antwort

27

sollten Sie opaque pointers verwenden und nur schließen C++ Header in der Datei, die Ihre Objective-C-Klasse implementiert. Auf diese Weise können nicht mit Gewalt andere Dateien, die den Header enthalten 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

Danke, die anderen Vorschläge schienen nicht zu funktionieren und ich endete damit, mein Objekt als "id *" zu deklarieren und es dann an den richtigen Typ zu übertragen, wo immer ich es verwenden wollte. Dies scheint die gleiche Idee zu sein, ist aber viel sauberer, da ich nicht alle zusätzlichen Casts machen muss. – Winder

+2

Ich würde immer undurchsichtige Zeiger auf Guss bevorzugen - es könnte ein bisschen mehr Arbeit sein, aber Sie bekommen volle Typsicherheit zurück. –

+0

Ich habe mit undurchsichtigen Zeigern dafür gespielt, die ich ausgiebig für C/C++ - Wrapping verwende, aber bis jetzt habe ich den wirklichen Vorteil nicht gesehen. Können Sie diesen Stil (zusammen mit Code, der zeigt, wie "undurchsichtig" zugewiesen und freigegeben wird) mit dem void * -basierten Stil vergleichen: http://robnapier.net/blog/wrapping-c-objc-20 –

0

ich glaube, Sie müssen das folgende Flag auf true in den Projekteinstellungen festlegen:

GCC_OBJC_CALL_CXX_CDTORS = YES 

Dies sollte Ihnen ermöglichen, C++ - Objekte in Ihren Objective-C-Klassen zu instanziieren.

+0

Dies scheint nicht zu funktionieren. Ich benutze Xcode 3.2.1 und das 3.0 iphone SDK. – Winder

3

Stellen Sie sicher, dass alle Dateien, die GLViewController.h enthalten, Objective-C++ - Quellen (* .mm) sind.

Wenn Sie C++ Code in der Kopfzeile Ihrer View-Controller enthalten, alle Quellen, die diese Header importieren Lage sein muss, um es zu verstehen, so dass sie in Objective-C sein muss ++

2

Sie benötigen die C++ Objekte in einem Schnittstellenblock in Ihrer .mm Datei zu erklären.

In .mm:

#include "SomeCPPclass.h" 

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

Nimm die Notiz() - das ist die schwarze Magie, die das macht :) – goelectric

Verwandte Themen