Добавление объекта С++ в класс Objective-C
Я пытаюсь смешивать С++ и Objective-C, я сделал это большую часть пути, но хотел бы иметь один класс интерфейса между Objective-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();
}
Ответы
Ответ 1
Вы должны использовать непрозрачные указатели и включать только заголовки С++ в файл, который реализует ваш класс 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
Ответ 2
Убедитесь, что все файлы, содержащие GLViewController.h
, являются Objective-C ++ источниками (*.mm).
Когда вы включаете код С++ в заголовок вашего контроллера представлений, все источники, которые импортируют этот заголовок, должны быть способны его понять, поэтому они должны быть в Objective-C ++
Ответ 3
Вам нужно объявить объекты С++ в блоке интерфейса в файле .mm.
В .mm:
#include "SomeCPPclass.h"
@interface SomeDetailViewController () {
SomeCPPclass* _ipcamera;
}
@property (strong, nonatomic) UIPopoverController *masterPopoverController;
- (void)blabla;
@end
Ответ 4
Я думаю, вам нужно установить следующий флаг в true
в настройках вашего проекта:
GCC_OBJC_CALL_CXX_CDTORS = YES
Это должно позволить вам создавать экземпляры С++ в классах Objective-C.