2010-02-14 3 views
17

Я пытаюсь смешивать C++ и Objective-C, я сделал это большую часть пути, но хотел бы иметь один класс интерфейса между кодом Objective-C и C++. Поэтому я хотел бы иметь постоянный объект C++ в интерфейсе ViewController.Добавление объекта C++ в Objective-C Класс

Это терпит неудачу, запрещая декларацию «myCppFile» без указания типа:

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

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

@end 

Однако это работает только штрафом в файле реализации .mm (Это не работает, потому что я хочу cppobject сохраняться между вызовами)

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

ответ

27

Вы должны использовать opaque pointers и включают в себя только C++ заголовки в файле, который реализует ваш Objective-C класс. Таким образом, вы не заставляйте других файлов, которые включают в себя заголовок использовать 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

Спасибо, другие предложения, похоже, не сработали, и я закончил тем, что объявил свой объект как «id *», а затем применил его к правильному типу везде, где я хотел его использовать. Это похоже на ту же идею, но намного чище, так как мне не нужно делать все лишние броски. – Winder

+2

Я всегда предпочитаю непрозрачные указатели на броски - это может быть немного больше работы, но вы получите полную защиту типа. –

+0

Я играю с непрозрачными указателями для этого, который я широко использую для упаковки C/C++, но до сих пор я не видел реальной выгоды. Можете ли вы сравнить этот стиль (наряду с некоторым кодом, показывающим, как «непрозрачный» выделен и выпущен) в стиле на основе void * здесь: http://robnapier.net/blog/wrapping-c-objc-20 –

0

Я думаю, вам нужно установить следующий флаг для true в настройках проекта:

GCC_OBJC_CALL_CXX_CDTORS = YES 

Это должно позволить вам создавать экземпляры объектов C++ в классах Objective-C.

+0

Это не похоже на работу. Я использую Xcode 3.2.1 и 3.0 iphone SDK. – Winder

3

Убедитесь, что все файлы, содержащие GLViewController.h, являются объектно-C++-источниками (* .mm).

При включении C++ код в заголовке контроллера зрения, все источники, которые импортируют этот заголовок должен быть в состоянии понять это, поэтому они должны быть в Objective-C++

2

Вы должны объявить C++ объекты в интерфейсе блока в файле .mm.

В .mm:

#include "SomeCPPclass.h" 

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

Обратите внимание на() - это черная (эт) магия, которая делает эту работу :) – goelectric

Смежные вопросы