2010-02-14 33 views
17

Tôi đang cố gắng kết hợp C++ và Objective-C, tôi đã thực hiện hầu hết các cách nhưng muốn có một lớp giao diện duy nhất giữa mã Objective-C và C++. Vì vậy, tôi muốn có một đối tượng C++ liên tục trong giao diện ViewController.Thêm đối tượng C++ vào Objective-C Class

này thất bại bởi cấm tuyên bố 'myCppFile' không có loại:

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

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

@end 

Tuy nhiên điều này chỉ hoạt động tốt trong các tập tin thực hiện .mm (Nó không làm việc vì tôi muốn cppobject để tồn tại giữa các cuộc gọi)

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

Trả lời

27

Bạn nên sử dụng opaque pointers và chỉ bao gồm C++ các tiêu đề trong tệp thực hiện lớp Objective-C của bạn. Bằng cách đó bạn không buộc các file khác bao gồm tiêu đề sử dụng 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

Cảm ơn, các đề xuất khác dường như không hoạt động và tôi đã kết thúc tuyên bố đối tượng của mình là "id *", sau đó truyền nó đến đúng loại ở mọi nơi tôi muốn sử dụng. Điều này có vẻ giống như ý tưởng, nhưng sạch hơn nhiều vì tôi không phải làm tất cả các phôi phụ. – Winder

+2

Tôi luôn thích các con trỏ đục hơn các phôi - nó có thể là một công việc nhiều hơn một chút, nhưng bạn có được sự an toàn kiểu đầy đủ. –

+0

Tôi đã chơi với con trỏ mờ đục cho điều này, mà tôi sử dụng rộng rãi cho C/C++ gói, nhưng cho đến nay tôi đã không nhìn thấy lợi ích thực sự. Bạn có thể so sánh phong cách này (cùng với một số mã cho thấy cách "đục" được phân bổ và phát hành) theo phong cách void * ở đây: http://robnapier.net/blog/wrapping-c-objc-20 –

0

tôi nghĩ rằng bạn cần phải thiết lập các cờ sau để true trong cài đặt dự án của bạn:

GCC_OBJC_CALL_CXX_CDTORS = YES 

Điều này sẽ cho phép bạn tạo nhanh các đối tượng C++ trong các lớp Objective-C của bạn.

+0

này dường như không làm việc. Tôi đang sử dụng Xcode 3.2.1 và SDK iPhone 3.0. – Winder

3

Đảm bảo rằng tất cả các tệp bao gồm GLViewController.h là các nguồn mục tiêu-C++ (* .mm).

Khi bạn bao gồm C++ trong tiêu đề của bộ điều khiển tầm nhìn của bạn, tất cả các nguồn nhập khẩu tiêu đề này phải có khả năng hiểu được nó, vì vậy họ phải nằm trong Objective-C++

2

Bạn cần phải khai báo C++ đối tượng trong một khối giao diện trong file .mm của bạn.

Trong .mm:

#include "SomeCPPclass.h" 

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

Ghi chú gần() - đó là ma thuật đen (et) tạo ra công việc này :) – goelectric

Các vấn đề liên quan