在Objective-C ++的.h文件中添加指向已定义的Objective-C类的指针

时间:2017-09-24 09:56:00

标签: c++ objective-c macos objective-c++ cross-language

是否可以在Objective-C ++中创建类,该类的字段是指向Objective-C接口的指针(在.h文件中)?

为了澄清一点,我创建了一个Objective-C界面:

// Our platform independent class
@interface LoggerDelegate : NSObject<SomeDelegate>
@end

我可以在.mm文件中创建它并且它可以工作,但它适用于全局变量,我不允许更改其范围。所以我想在Logger.h

中使用它
class Logger {
public:

private:

LoggerDelegate* _ptr;   //<--- pointer to the Objective-C interface
};

当我在Logger.mm内定义界面时,它可以正常工作。但是可以在.h文件中合并Objective-C和C ++中的Objective-C ++代码吗?或者只能在.mm个文件中使用?

1 个答案:

答案 0 :(得分:1)

语言家庭

Objective-C使用.h标头和.m实施文件。在抽象接口的情况下,您可能不需要后者。所有这些文件都必须符合Objective-C语法:

  • 您可以在.h.m中使用某种C语法;它将被认可,因为目标C是C的语言扩展。
  • Objective-C编译器无法识别纯C ++语言元素(例如classtemplate)。

Objective-C++还使用.h标题,但.mm实施文件。两者都必须符合Objective-C ++语法:

  • 大多数C ++语法都会被识别,因为Objective C ++基于C ++。
  • 将识别所有Objective-C语法,因为Objective C是Objective-C ++的子集。

Standard C++使用标头(通常为.h.hpp)和实施文件(通常为.cc.cpp)。这些必须只使用C ++语言元素。不属于C ++的Objective-C和Objective-C ++语言元素(例如@interface)将触发C ++编译错误。

混合语言 - 语法问题

混合Objective-C和Objective-C ++ :如果在Objective-C和Objective C ++之间共享标题(.h),则必须同时遵守Objective-C和目标C ++。因此,标题只能使用两种语言之间的公分母,即Objective-C(和C)语言元素。

混合使用标准C ++和目标C / C ++ :您只能在Objective-C ++中将C ++语言与Objective-C或Objective-C ++结构相结合(所以.mm文件,最终{ {1}}当且仅当未包含在任何标准C ++或Objective-C源代码中时<)

这就是为什么你可以在.h文件中使用Objective-C接口的原因。但是您无法在包含在C ++代码中的.mm文件中使用它。

混合语言 - 语义问题

标准C ++和Objective-C / C ++的对象模型和生命周期不尽相同。这使得互操作性变得困难。例如,C ++类不能从Objective-C类继承,如果Objective-C类包含C ++对象,construction可能会很棘手。并且没有C ++语言构造可以保证与Objective-C ++ .h本身兼容。

但是有没有办法与指针互操作?

可以使用PIMPL idiom(也称为&#34;不透明指针&#34;)来管理从C ++到Objective-C ++对象的指针。 This brilliant article from Phil Jordan解释了如何使用您可以轻松重复使用的示例来执行此操作。

Phil Jordan的主要想法是使用标头将Objective-C ++对象用指向不完整对象的指针包装到标准C ++类中。 Phil以巧妙的方式使用条件编译,允许使用相同的@interface用于跨语言目的:

.h

这可确保包含标头的C ++代码永远不会使用指针对包装对象执行任何操作。然后,将在#ifdef __OBJC__ @class XXXX; // if header used in Objective C++ #else struct XXXX; // if header used in standard C++ #endif class WrapperClass { // standard C++ class also recognuzed by Objective C++ XXXX *wrapped_objective_c_object_pointer; public: ...// public interface for C++ }; 文件中提供C ++包装器类的实现,该文件了解Objective C ++语义。我强烈建议您阅读本文以了解该解决方案的所有细节。