我有一个 Cocoa 项目(一个 Mac OS X 应用程序),全部是 Objective-C。我从另一个项目中引入了一个 C++ 类(我知道它可以工作),并为它制作了一个 Objective-C 包装器。 ObjC 包装器类使用 .mm 扩展名。但是,C++ 头文件包含 #include
s 到标准 C++ 头文件(例如 <vector>
),我在这些文件上出错。
一个最小的例子如下所示。 CppClass 是 C++ 类,而 CppWrapper 是包装它的 ObjC 类。
// CppClass.h
#ifndef _CPP_CLASS_H_
#define _CPP_CLASS_H_
#include <vector>
class CppClass
{
public:
CppClass() {}
~CppClass() {}
private:
std::vector<int> my_ints;
};
#endif /* _CPP_CLASS_H_ */
// CppWrapper.h
#import <Foundation/Foundation.h>
#import "CppClass.h"
@interface CppWrapper : NSObject {
CppClass* myCppClass;
}
@end
// CppWrapper.mm
#import "CppWrapper.h"
@implementation CppWrapper
- (id)init
{
self = [super init];
if (self) {
myCppClass = new CppClass;
}
return self;
}
- (void)dealloc
{
delete myCppClass;
[super dealloc];
}
@end
// The file that uses CppWrapper
// TestAppDelegate.m
#import "TestAppDelegate.h"
#import "CppWrapper.h"
@implementation TestAppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
myWrapper = [[CppWrapper alloc] init];
}
@end
我得到的错误是 #include
的 vector
在 CppClass.h 中。错误是
lexical or Preprocessor issue:
'vector'
file not found
这段代码在另一个(全 C++)项目中运行良好,所以我很确定这是一个build设置,或者我在包装类中做错了什么。我正在使用 Xcode 4。我创建了一个默认的 Cocoa Mac OS 应用程序项目,所有设置都是默认的。
更新:我刚刚意识到,如果我将 TestAppDelegate 的文件类型设置为 Objective-C++(或将其重命名为 TestAppDelegate.mm),它就可以工作。我不明白的是,这个类是纯 Objective-C;为什么必须将其编译为 Objective-C++?在我的 C++ 类上使用 Objective-C 包装器的全部意义在于,我不必将整个项目构建为 Objective-C++。
最佳答案
CppWrapper
类的问题是它没有提供纯 Objective-C 接口(interface)。在您的 CppWrapper.h
文件中,您正在导入 C++ 类的头文件,这意味着任何导入包装器类的 Objective-C 类都需要编译为 Objective-C++,包括您的 TestAppDelegate
。
相反,您需要执行类似这样的操作才能将 C++ 完全隐藏在 CppWrapper.mm
文件中:
// CppWrapper.h
#import <Foundation/Foundation.h>
@interface CppWrapper : NSObject {
void *myCppClass;
}
- (void)doSomethingWithCppClass;
@end
// CppWrapper.mm
#import "CppWrapper.h"
#import "CppClass.h"
@implementation CppWrapper
- (id)init {
self = [super init];
if (self) {
myCppClass = new CppClass;
}
return self;
}
- (void)dealloc {
delete myCppClass;
[super dealloc];
}
- (void)doSomethingWithCppClass {
static_cast<CppClass *>(myCppClass)->DoSomething();
}
@end
关于c++ - 在 Cocoa 项目中使用 C++ 类时找不到标准 C++ 包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6083764/