Добавление объекта C ++ в класс Objective-C - PullRequest
18 голосов
/ 14 февраля 2010

Я пытаюсь смешать C ++ и Objective-C, я сделал это по большей части, но хотел бы иметь один интерфейсный класс между Objective-C и 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();
}

Ответы [ 4 ]

28 голосов
/ 14 февраля 2010

Вы должны использовать непрозрачные указатели и включать только заголовки 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
3 голосов
/ 14 февраля 2010

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

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

2 голосов
/ 11 августа 2013

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

дюймы мм:

#include "SomeCPPclass.h"

@interface SomeDetailViewController () {
    SomeCPPclass*    _ipcamera;
}
@property (strong, nonatomic) UIPopoverController *masterPopoverController;
- (void)blabla;
@end
0 голосов
/ 14 февраля 2010

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

GCC_OBJC_CALL_CXX_CDTORS = YES

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

...