混合Objective-C和C ++

我正在尝试将Objective-C与C ++混合使用。 当我编译代码时,出现了几个错误。

#import <Cocoa/Cocoa.h> #include "Bh" @interface A : NSView { B *b; } -(void) setB: (B *) theB; @end 

上午

 #import "Ah" @implementation A - (id)initWithFrame:(NSRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code here. } return self; } - (void)drawRect:(NSRect)dirtyRect { // Drawing code here. } -(void) setB: (B *) theB { b = theB; } @end 

BH

 #include <iostream> class B { B() { std::cout << "Hello from C++"; } }; 

这里是错误:

 /Users/helixed/Desktop/Example/Bh:1:0 /Users/helixed/Desktop/Example/Bh:1:20: error: iostream: No such file or directory /Users/helixed/Desktop/Example/Bh:3:0 /Users/helixed/Desktop/Example/Bh:3: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'B' /Users/helixed/Desktop/Example/Ah:5:0 /Users/helixed/Desktop/Example/Ah:5: error: expected specifier-qualifier-list before 'B' /Users/helixed/Desktop/Example/Ah:8:0 /Users/helixed/Desktop/Example/Ah:8: error: expected ')' before 'B' /Users/helixed/Desktop/Example/Am:26:0 /Users/helixed/Desktop/Example/Am:26: error: expected ')' before 'B' /Users/helixed/Desktop/Example/Am:27:0 /Users/helixed/Desktop/Example/Am:27: error: 'b' undeclared (first use in this function) 

你需要命名你的.m文件.mm 。 你将能够用Objective-C编译C ++代码。

所以,按照你的例子,你的AView.m文件应该被命名为AView.mm 。 这很简单。 它工作得很好。 我在iPhone项目中使用了大量的std容器(std :: vector,std :: queue等)和传统的C ++代码,没有任何复杂性。

没关系,我觉得很愚蠢。 所有你需要做的就是将AView.m重命名为AView.mm,以便编译器知道它是Objective-C ++,并且编译没有问题。

您可以使用C ++类的前向声明保持界面清洁:

 #import <AnObjCclass.h> class DBManager; // This is a C++ class. NOTE: not @class @interface AppDelegate : UIResponder <UIApplicationDelegate, CLLocationManagerDelegate, MFMailComposeViewControllerDelegate> { DBManager* db; ... } 

我遇到这篇文章可能有帮助。 混合Objective-C,C ++和Objective-C ++

我分享了我在这个主题上理解的一些观点。

我们可以将.cpp和.m文件与纯C接口混合使用。 正如我们所知,Clang编译器将支持C ++,Objective C和Objective C ++,所以这可能是混合这些语言的更好方法。

混合这些语言时需要注意的一件事是使用头文件。 通过在类扩展中声明Cpp对象,我们可以将C ++保留在Objective C头文件之外。

或者,我们可以在Objective Cpp(.mm)文件中的@implementation块的开头声明cpp对象。

当我们处理Cpp对象时,pipe理内存将是一个问题。 我们可以使用'new'为对象分配内存,并通过调用'delete object'释放内存。 通常,如果我们使用ARC,我们不需要知道释放对象的内存。

当使用cpp类时,我们可以用两种方式声明一个Cpp对象:CppWrapper wrapper和CppWrapper * wrapper,其中CppWrapper是一个Cpp类。 当我们使用后者时,程序员负责pipe理内存。

另外一个主要的问题是当我们使用参数调用一个客观的C方法时,我们传递的是引用,而在cpp中,我们需要通过引用来传递参数,使用'&'关键字,否则传递的是对象的副本。

Objective C对象的释放是在运行时处理的,当'delete'被调用到Cpp对象时,它将不再保留在内存中。

在编写Cpp时,我们共享了指针和弱指针,类似于Objective C中的强弱。

http://philjordan.eu/article/mixing-objective-c-c++-and-objective-c++ http://www.raywenderlich.com/62989/introduction-c-ios-developers-part-1

在希望引入简单的C ++函数(如std::cout << Hot Licks提供了一个很好的select。

改变“ Identity and Type ”来自: Objective-C source到: Objective-C++ source

.mm扩展名只是标识文件types; 然后你正在寻找一个Objective-C ++而不是一个Objective-Ctypes。