将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
我认为你需要设置以下标志true
在您的项目设置:
这应该允许您在Objective-C类中实例化C++对象。
这似乎并没有工作。我正在使用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
请注意() - 这是使这项工作的黑色(et)魔术:) – goelectric 2014-03-27 18:09:34
谢谢,其他建议似乎并没有工作,我最终宣布我的对象为“id *”,然后将它转换为我想要使用它的任何地方的正确类型。这似乎是一样的想法,但是因为我不必做所有额外的演员,所以更清洁。 – Winder 2010-02-14 20:33:05
我总是更喜欢不透明的指针,而不是更多的工作,但是您可以重新获得完整的安全类型。 – 2010-02-14 20:41:11
我一直在玩这个不透明的指针,这个指针我广泛用于C/C++包装,但到目前为止我还没有看到真正的好处。你能比较这种风格(以及一些代码显示“不透明”是如何分配和释放的)这里基于void *的风格:http://robnapier.net/blog/wrapping-c-objc-20 – 2010-02-20 16:44:21