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

问题描述:

我正在尝试混合使用C++和Objective-C,我已经做了大部分的工作,但希望在Objective-C和C++代码之间有一个接口类。因此我想在ViewController接口中有一个持久的C++对象。将C++对象添加到Objective-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(); 
} 

您应该使用opaque pointers,仅包括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 
+0

谢谢,其他建议似乎并没有工作,我最终宣布我的对象为“id *”,然后将它转换为我想要使用它的任何地方的正确类型。这似乎是一样的想法,但是因为我不必做所有额外的演员,所以更清洁。 – Winder 2010-02-14 20:33:05

+2

我总是更喜欢不透明的指针,而不是更多的工作,但是您可以重新获得完整的安全类型。 – 2010-02-14 20:41:11

+0

我一直在玩这个不透明的指针,这个指针我广泛用于C/C++包装,但到目前为止我还没有看到真正的好处。你能比较这种风格(以及一些代码显示“不透明”是如何分配和释放的)这里基于void *的风格:http://robnapier.net/blog/wrapping-c-objc-20 – 2010-02-20 16:44:21

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

​​

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

+0

这似乎并没有工作。我正在使用Xcode 3.2.1和3.0 iphone SDK。 – Winder 2010-02-14 18:29:19

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

如果包括C++代码在您的视图控制器的标题,所有导入这个头必须能够了解它的来源,所以他们必须在Objective-C++

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

在.mm:

#include "SomeCPPclass.h" 

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

请注意() - 这是使这项工作的黑色(et)魔术:) – goelectric 2014-03-27 18:09:34