Я пытаюсь смешать C++ и Objective C, я сделал его большей частью пути, но хотел бы иметь единственный интерфейсный класс между кодом C++ и Objective C. Поэтому я хотел бы иметь персистентный объект C++ в интерфейсе ViewController.
Это перестало работать путем запрещения объявления '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();
}
Вы должны использовать непрозрачные указатели и включать только заголовки C ++ в файл, который реализует вашу цель- 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
] Я думаю, вам нужно установить следующий флаг в true
в настройках вашего проекта:
GCC_OBJC_CALL_CXX_CDTORS = YES
Это должно позволить вам создавать экземпляры объектов C ++ в ваших классах Objective-C.
Убедитесь, что все файлы, включающие GLViewController.h
, являются исходниками Objective-C++ (*.mm).
Когда вы включаете C++ код в заголовок вашего контроллера представления, все исходники, которые импортируют этот заголовок, должны быть способны понять его, поэтому они должны быть на Objective-C++