c++ - 在 Cocoa 项目中使用 C++ 类时找不到标准 C++ 包含

标签 c++ objective-c cocoa wrapper

我有一个 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

我得到的错误是 #includevector在 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/

相关文章:

objective-c - 读写plist文件的奇怪问题

ios - 在 objective-c 中注册设置代码

cocoa - 保护桌面 Mac .app 中的文件

c++ - 使用 boost::asio 的 HTTP POST 请求

c++ - 将字符串注入(inject) 'cin'

iphone - 同一文本中的多种颜色

cocoa - 扩展 CoreDataGenerateAccessors 行为

c++ - 获取linux输入设备

c++ - 使用 Boost 解码 Base64 字符串

ios - iOS 11 中如何判断是否录屏