混合Objective-C和C ++

时间:2010-04-26 00:21:35

标签: c++ objective-c objective-c++

我正在尝试将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)

5 个答案:

答案 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类型。