是否可以在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
个文件中使用?
答案 0 :(得分:1)
Objective-C使用.h
标头和.m
实施文件。在抽象接口的情况下,您可能不需要后者。所有这些文件都必须符合Objective-C语法:
.h
或.m
中使用某种C语法;它将被认可,因为目标C是C的语言扩展。class
或template
)。 Objective-C++还使用.h
标题,但.mm
实施文件。两者都必须符合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 ++语义。我强烈建议您阅读本文以了解该解决方案的所有细节。