将C ++对象添加到Objective-C类

时间:2010-02-14 17:32:42

标签: iphone c++ objective-c objective-c++

我正在尝试混合C ++和Objective-C,我已经完成了大部分工作,但希望在Objective-C和C ++代码之间有一个单独的接口类。因此,我希望在ViewController接口中有一个持久的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();
}

4 个答案:

答案 0 :(得分:28)

您应该使用opaque pointers,并且只在实现Objective-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

答案 1 :(得分:3)

确保包含GLViewController.h的所有文件都是Objective-C ++源(* .mm)。

当您在视图控制器的标头中包含C ++代码时,导入此标头的所有源必须能够理解它,因此它们必须位于Objective-C ++

答案 2 :(得分:2)

您需要在.mm文件的接口块中声明C ++对象。

在.mm:

#include "SomeCPPclass.h"

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

答案 3 :(得分:0)

我认为您需要在项目设置中将以下标志设置为true

GCC_OBJC_CALL_CXX_CDTORS = YES

这应该允许您在Objective-C类中实例化C ++对象。