我正在尝试将Objective-C与C ++混合使用。当我编译代码时,我得到了几个错误。
A.H
#import <Cocoa/Cocoa.h>
#include "B.h"
@interface A : NSView {
B *b;
}
-(void) setB: (B *) theB;
@end
A.M
#import "A.h"
@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
B.h
#include <iostream>
class B {
B() {
std::cout << "Hello from C++";
}
};
以下是错误:
/Users/helixed/Desktop/Example/B.h:1:0 /Users/helixed/Desktop/Example/B.h:1:20: error: iostream: No such file or directory
/Users/helixed/Desktop/Example/B.h:3:0 /Users/helixed/Desktop/Example/B.h:3: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'B'
/Users/helixed/Desktop/Example/A.h:5:0 /Users/helixed/Desktop/Example/A.h:5: error: expected specifier-qualifier-list before 'B'
/Users/helixed/Desktop/Example/A.h:8:0 /Users/helixed/Desktop/Example/A.h:8: error: expected ')' before 'B'
/Users/helixed/Desktop/Example/A.m:26:0 /Users/helixed/Desktop/Example/A.m:26: error: expected ')' before 'B'
/Users/helixed/Desktop/Example/A.m:27:0 /Users/helixed/Desktop/Example/A.m:27: error: 'b' undeclared (first use in this function)
答案 0 :(得分:76)
您需要将 .m 文件命名为 .mm 。您将能够使用Objective-C编译C ++代码。
因此,按照您的示例,您的 AView.m 文件应命名为 AView.mm 。这很简单。它工作得很好。我在iPhone项目中使用了很多std容器(std :: vector,std :: queue等)和遗留的C ++代码而没有任何复杂性。
答案 1 :(得分:5)
没关系,我觉得很蠢。您所要做的就是将AView.m重命名为AView.mm,以便编译器知道它的Objective-C ++,并且编译没有问题。
答案 2 :(得分:2)
您可以使用C ++类的前向声明来保持界面清晰:
#import <AnObjCclass.h>
class DBManager; // This is a C++ class. NOTE: not @class
@interface AppDelegate : UIResponder <UIApplicationDelegate,
CLLocationManagerDelegate,
MFMailComposeViewControllerDelegate>
{
DBManager* db;
...
}
答案 3 :(得分:1)
我正在分享我在这个主题上所理解的一些观点。
我们可以将.cpp和.m文件与纯C接口混合使用。我们知道Clang编译器将支持C ++,Objective C以及Objective C ++,它可能是混合这些语言的更好方法。
混合使用这些语言时要注意的一件事是使用头文件。我们可以通过在类扩展中声明Cpp对象来保持C ++不在Objective C头中。
或者我们可以在Objective Cpp(.mm)文件中的@implementation块的开头声明cpp对象。
当我们处理Cpp对象时,管理内存将是一个问题。我们可以使用'new'为对象分配memmory,并通过调用'delete object'释放内存。通常,如果我们使用ARC,我们不需要知道释放对象的内存。
在使用cpp类时,我们可以用两种方式声明一个Cpp对象,比如CppWrapper wrapper和CppWrapper * wrapper,其中CppWrapper是一个Cpp类。当我们使用后者时,程序员负责管理memmory。
另一个主要的问题是,当我们使用参数调用目标C方法时,我们传递引用,而在cpp中我们需要使用'&amp;'关键字通过引用传递参数,否则复制对象已经通过了。
在运行时处理Objective C对象的释放,其中当对Cpp对象调用'delete'时,它将不再保留在内存中。
编写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
答案 4 :(得分:0)
在你希望引入像std::cout <<
之类的简单C ++函数的情况下,Hot Licks提供了一个很好的选择。
将“Identity and Type
”从:Objective-C source
改为:Objective-C++ source
.mm扩展名只是标识文件类型;然后你正在寻找一个Objective-C ++而不是Objective-C类型。