18

我正在尝试混合 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

4 回答 4

28

您应该使用不透明的指针,并且只在实现您的 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
于 2010-02-14T19:17:07.280 回答
3

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

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

于 2010-02-14T18:45:36.000 回答
2

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

以.mm 为单位:

#include "SomeCPPclass.h"

@interface SomeDetailViewController () {
    SomeCPPclass*    _ipcamera;
}
@property (strong, nonatomic) UIPopoverController *masterPopoverController;
- (void)blabla;
@end
于 2013-08-11T15:52:27.117 回答
0

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

GCC_OBJC_CALL_CXX_CDTORS = YES

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

于 2010-02-14T17:41:33.967 回答