在 Objective-C 中使用 C++ class - 为什么使用 PImpl 习语?
Using C++ class in Objective-C - Why use PImpl idiom?
假设我有一个简单的 C++ class:
// MyCPPClass.hpp
class MyCPPClass {
std::uint8_t m_num1 = 0;
std::uint8_t m_num2 = 0;
std::string GetText() const;
}
我想在 Objective-C class:
中使用它
// MyObjCClass.h
@interface MyObjCClass {
@public
MyCPPClass _cppObj;
}
除了必须为 PImpl 部分编写更多代码之外,与将其直接嵌入到 Obj-C class(如上所述)相比,我使用 PImpl 惯用语的真正好处是什么?
缺点是此 C++ 类型 MyCPPClass
现在位于 header 文件 MyObjCClass.h
中,其他 Objective-C class 使用 [=12] =] 将不得不导入。导入 header 就像将其放入代码中,因此这些其他 Objective-C classes 现在的代码中包含 C++,因此现在必须更改为 Objective-C ++ 文件,否则它们将无法编译。这通常是不可取的,因为这些其他文件不需要 C++。虽然这个问题可以通过在 header 中的主 class 声明中声明你的实例变量来解决,但在 "extension" 中声明(像类别一样声明但括号中没有名称)或在 @implementation
中,它们在实现文件中,因此其他 class 不必导入它。
C++ classes 作为 Objective-C classes 的实例变量的另一个问题是你的 C++ object 只能使用默认构造函数构造(即没有构造函数参数),因为无法为 Objective-C class 的实例变量提供初始值设定项。所以如果你想用构造函数参数构造它,你必须使用pimpl。
假设我有一个简单的 C++ class:
// MyCPPClass.hpp
class MyCPPClass {
std::uint8_t m_num1 = 0;
std::uint8_t m_num2 = 0;
std::string GetText() const;
}
我想在 Objective-C class:
中使用它// MyObjCClass.h
@interface MyObjCClass {
@public
MyCPPClass _cppObj;
}
除了必须为 PImpl 部分编写更多代码之外,与将其直接嵌入到 Obj-C class(如上所述)相比,我使用 PImpl 惯用语的真正好处是什么?
缺点是此 C++ 类型 MyCPPClass
现在位于 header 文件 MyObjCClass.h
中,其他 Objective-C class 使用 [=12] =] 将不得不导入。导入 header 就像将其放入代码中,因此这些其他 Objective-C classes 现在的代码中包含 C++,因此现在必须更改为 Objective-C ++ 文件,否则它们将无法编译。这通常是不可取的,因为这些其他文件不需要 C++。虽然这个问题可以通过在 header 中的主 class 声明中声明你的实例变量来解决,但在 "extension" 中声明(像类别一样声明但括号中没有名称)或在 @implementation
中,它们在实现文件中,因此其他 class 不必导入它。
C++ classes 作为 Objective-C classes 的实例变量的另一个问题是你的 C++ object 只能使用默认构造函数构造(即没有构造函数参数),因为无法为 Objective-C class 的实例变量提供初始值设定项。所以如果你想用构造函数参数构造它,你必须使用pimpl。