在Objective-C中使用C ++类 - 为什么要使用PImpl成语?

时间:2017-02-07 09:48:26

标签: c++ objective-c objective-c++ pimpl-idiom

假设我有一个简单的C ++类:

// MyCPPClass.hpp
class MyCPPClass {
    std::uint8_t m_num1 = 0;
    std::uint8_t m_num2 = 0;

    std::string GetText() const;
}

我希望在Objective-C类中使用它:

// MyObjCClass.h
@interface MyObjCClass {


    @public
        MyCPPClass _cppObj;
}

除了必须为PImpl部分编写更多代码之外,使用PImpl习惯用法直接将其嵌入到Obj-C类(如上所述)中我真正获得了什么?

1 个答案:

答案 0 :(得分:4)

缺点是这个C ++类型MyCPPClass现在位于头文件MyObjCClass.h中,使用MyObjCClass的其他Objective-C类必须导入。导入标题就像将它放入代码中一样,因此这些其他Objective-C类现在在其代码中都有C ++,因此现在必须将其更改为Objective-C ++文件,否则它们将无法编译。这通常是不可取的,因为这些其他文件不需要C ++。虽然这个问题可以通过声明你的实例变量不在标题中的主类声明中来解决,但是在"扩展中" (声明为类别,但括号中没有名称)或@implementation,它们位于实现文件中,因此其他类不必导入它。

C ++类作为Objective-C类的实例变量的另一个问题是你的C ++对象只能使用默认构造函数构造(即没有构造函数参数),因为没有办法为实例变量提供初始化器。一个Objective-C类。因此,如果您想使用构造函数参数构造它,则必须使用pimpl。