为C++库制作Objective-C包装器

nac*_*o4d 8 c++ iphone xcode stl objective-c

我试图在Objective-C中创建一个包装器,所以我不必在库类之外编写c ++.

库主文件是 LLAHProcessor.h .cpp

我的包装是 LLAHProcessorWrapper.h .mm

它编译得很好,但当我添加LLAHProcessorWrapper到其他类,(让我们说UIView)作为成员变量时,我得到了数百个错误,例如:

#include <map> : Map no such a file or directory
Run Code Online (Sandbox Code Playgroud)

在每个c ++类/结构中:

Expected specifier-qualifier list before ClassName
Run Code Online (Sandbox Code Playgroud)

就像编译器没有识别c ++代码一样.

我想知道我在这里失踪了什么.是否必须将我添加到Xcode Target Properties的事实:?

Other Link Flags : -lstdc++ -lz
Run Code Online (Sandbox Code Playgroud)

或者我可能需要在这里添加新标志?

提前致谢

Jer*_*myP 6

您的问题是.m文件被编译为C而不是C++.因此,当编译器在编译.m文件时,即使在头文件中遇到任何C++ ,它也会barf.

毫无疑问,你必须在头文件中加入一些C++,因为Objective C对象包装了一个C++对象,但是有很多方法可以解决这个问题.一种方法是使用指向C++对象的指针,并使用__cplusplus为C++(和Objective-C++)定义但不适用于C(或Objective-C)的方便的预处理器定义,例如

// LLAHProcessorWrapper.h

#if defined __cplusplus
class MyCPPClass;    // forward class declaration
#else
typedef struct MyCPPClass MyCPPClass;   // forward struct declaration
#endif

@interface MyOCClass : NSObject
{
@private
    MyCPPClass* cppObject;
} 

// methods and properties

@end
Run Code Online (Sandbox Code Playgroud)

由于您从不取消引用.mm文件外部的cppObject成员,因此您永远不会为结构提供完整定义.

你会newdelete指针分别在-init-dealloc.您将包含完整的C++类声明LLAHProcessorWrapper.mm.