2010-02-14 15 views
17

C++ ve Objective-C'yi karıştırmaya çalışıyorum, bunu en iyi şekilde yaptım ancak Objective-C ve C++ kodu arasında tek bir arabirim sınıfına sahip olmak istiyorum. Bu nedenle ViewController arabiriminde kalıcı bir C++ nesnesi olmasını isterim.C++ Nesnesini Objective-C Sınıfı'na Ekleme

Bu, hiçbir türüyle 'myCppFile' bildirimi yasaklayarak başarısız

:

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

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

@end 

Ancak bu (ben cppobject Aramalar arasında devam etmek istiyorum çünkü çalışmıyor, mm uygulama dosyasında gayet güzel çalışıyor)

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

cevap

27

Sen opaque pointers kullanmalı ve sadece YayınÄ ++ Objective-C sınıfınızı uygulayan dosyadaki başlıklar. Eğer ++ Objective-C kullanmaya başlığı içermesi diğer dosyaları zorlamayın Böylece:

// 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

Teşekkürler, diğer öneriler işe yaramadı ve ben nesneyi bir "id *" olarak ilan ettim ve sonra onu kullanmak istediğim her yerde doğru türe döktüm. Bu aynı fikir gibi gözüküyor, ancak tüm ekstra oyuncuları yapmak zorunda olmadığımdan çok daha temiz. – Winder

+2

Her zaman dökümler üzerinde opak işaretçileri tercih ederim - biraz daha fazla iş olabilir, ancak tam tip güvenlik elde edersiniz. –

+0

C/C++ sarma için kapsamlı olarak kullandığım bunun için opak işaretçilerle oynuyordum, ancak şu ana kadar gerçek faydayı görmedim. Bu stili ("opak" ın nasıl tahsis edildiğini ve serbest bırakıldığını gösteren bir kod ile birlikte) void * tabanlı stile göre karşılaştırabilirsiniz: http://robnapier.net/blog/wrapping-c-objc-20 –

0

ben size proje ayarlarında true için aşağıdaki bayrak ayarlamanız gerekir düşünüyorum:

GCC_OBJC_CALL_CXX_CDTORS = YES 

Bu, Object-C sınıflarınızdaki C++ nesnelerini başlatmanıza izin vermelidir.

+0

Bu çalışmaya görünmüyordu. Xcode 3.2.1 ve 3.0 iphone SDK kullanıyorum. – Winder

3

GLViewController.h'u içeren tüm dosyaların Objective-C++ kaynakları (* .mm) olduğundan emin olun. Eğer görünüm denetleyicisi başlığında ++ kod, bu başlık bunu anlamak gerekir içe tüm kaynaklar, YayınÄ yüzden Objective-C++ olmalıdır zaman

2

Sen, mm dosyasında bir arayüz blokta C++ nesneleri ilan etmek gerekir. , mm olarak

:

#include "SomeCPPclass.h" 

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

() - bu işi yapan siyah (et) büyüsü) 'nin yakın notunu alın :) – goelectric

İlgili konular