2010-02-14 17 views
17

Próbuję miksować C++ i Objective-C, zrobiłem to przez większość drogi, ale chciałbym mieć pojedynczą klasę interfejsu między kodem Objective-C i C++. Dlatego chciałbym mieć stały obiekt C++ w interfejsie ViewController.Dodawanie obiektu C++ do klasy Objective-C

To nie zabraniając deklarację „myCppFile” bez typu:

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

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

@end 

Jednak to działa dobrze w pliku wdrażania .mm (To nie działa, ponieważ chcę cppobject utrzymują się między połączeniami)

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

Odpowiedz

27

Należy używać opaque pointers i zawierać tylko C++ nagłówki w pliku, który implementuje twoją klasę Objective-C. W ten sposób nie zmuszaj innych plików, które zawierają nagłówek do korzystania 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

Dzięki, inne sugestie nie działały, a ja zadeklarowałem swój obiekt jako "id *", a następnie rzuciłem go we właściwy typ wszędzie, gdzie chciałem go użyć. Wydaje się, że to ten sam pomysł, ale jest o wiele czystszy, ponieważ nie muszę wykonywać wszystkich dodatkowych rzutów. – Winder

+2

Zawsze wolałbym nieprzezroczyste wskaźniki od rzutów - może to być trochę więcej pracy, ale otrzymasz pełny zwrot bezpieczeństwa. –

+0

Grałem z nieprzezroczystymi wskaźnikami, które używam intensywnie do pakowania C/C++, ale jak dotąd nie widziałem prawdziwej korzyści. Czy możesz porównać ten styl (wraz z kodem pokazującym, jak "nieprzezroczyste" jest przydzielane i wydawane) do stylu pustego * tutaj: http://robnapier.net/blog/wrapping-c-objc-20 –

0

myślę, że trzeba ustawić następujące flagi do true w ustawieniach projektu:

GCC_OBJC_CALL_CXX_CDTORS = YES 

To powinno umożliwić tworzenie instancji obiektów C++ w klasach Objective-C.

+0

To nie wydają się działać. Używam Xcode 3.2.1 i 3.0 iPhone SDK. – Winder

3

Upewnij się, że wszystkie pliki, które zawierają GLViewController.h, są źródłami Objective-C++ (* .mm).

Po dołączeniu kodu C++ w nagłówku kontrolerze widoku, wszystkie źródła, które importują ten nagłówek musi być w stanie go zrozumieć, więc muszą być w Objective-C++

2

Musisz zadeklarować C++ obiektów w bloku interfejsu w pliku .mm.

W .mm:

#include "SomeCPPclass.h" 

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

Zapoznaj się z() - to czarna (et) magia, która sprawia, że ​​to działa :) – goelectric

Powiązane problemy