代码之家  ›  专栏  ›  技术社区  ›  rano

如何在Objtovi-C中封装C++ LIB?

  •  4
  • rano  · 技术社区  · 14 年前

    我有一个C++库(.h),它包含数据结构的实现,我想在我的iPhone应用程序中使用它。

    首先,我在ObjuleC++中编写了一个包装器,它通过构图有一个C++类的IVAR。然后我“被迫”将包装类扩展更改为 .mm

    我说的对吗?有没有办法把.mm扩展名“限制”在几个文件中?(防止姓名冲突等)

    编辑:更多可能有用的信息,我使用llvm1.5作为编译器(我注意到编译时错误的数量在gcc4.2到llvm1.5之间变化,但我不确定这是否意味着什么,因为我没有全部查看它们)

    4 回复  |  直到 14 年前
        1
  •  4
  •   Barry Wark    14 年前

    //MyWrapper.h
    
    #ifdef __cplusplus
    class ComposedClass;
    #endif 
    
    @interface MyWrapper : NSObject
    {
    #ifdef __cplusplus
    ComposedClass *ptr;
    #endif
    }
    
    // wrapped methods here...
    @end
    

    这是piml习惯用法的一个略显蹩脚的版本,但是代码较少,并且有效地将C++ ++ ISM从纯ObjuleC代码隐藏起来。显然,你必须包括 ComposedClass 的标题 MyWrapper.mm .

    如果 复合类 是模板类型,您需要修改第一个块

    #ifdef __cplusplus
    #include "ComposedClass.h"
    #endif
    

    这种方法是 suggested

        2
  •  4
  •   Ole Begemann    14 年前

    任何包含C++片段(不管多么小)的代码都必须用ObjuleC++(因此在.mm文件中)编译。如果你想缩小.mm文件的数量,你就必须把你的C++代码的功能包在ObjtoE-C类中,这样这个类的公共接口(IT.h文件)只包含Objto-C代码。这意味着包装类不能包含一个C++类型的公共IVAR。这是否是一个可行的方法,如果你的C++ LIB仅仅由一个数据结构组成,我不知道。

        3
  •  2
  •   Omnifarious    14 年前

    基本上,需要引用包装类的任何东西都是Objto-C++代码,而不是直C++。

    我建议您将包装器类的包含限制在实现(aka)中 .cpp

    技术,比如 Pimpl idiom 可以帮助您的类用户隔离它在ObjuleC++中部分实现的事实。

        4
  •  1
  •   sb.    13 年前

    我首选的解决方案是这个向前声明宏:

    #define FORWARD(cpp_class) struct cpp_class; typedef struct cpp_class cpp_class;

    FORWARD(SomeCppClass);
    
    @interface MyObjcWrapper : NSObject {
        SomeCppClass *ptr;
    }
    

    然后MyObjcWrPr.h可以安全地包含在Objtovi-C和ObjuleC++文件中。