C++ 类作为 Objective-C 类的实例变量

2024-03-04

我需要混合 Objective-C 和 C++。我想将所有 C++ 内容隐藏在一个类中,而将所有其他内容保留为纯 Objective-C。问题是我想要一些 C++ 类作为实例变量。这意味着它们必须在头文件中提及,头文件会被其他类包含,并且 C++ 开始传播到整个应用程序。到目前为止我能想到的最好的解决方案如下所示:

#ifdef __cplusplus
#import "cppheader.h"
#endif

@interface Foo : NSObject
{
    id regularObjectiveCProperty;
    #ifdef __cplusplus
    CPPClass cppStuff;
    #endif
}

@end

这有效。实现文件有一个mm扩展名,以便它被编译为与 C++ 混合的 Objective-C,#ifdef解锁 C++ 的东西,然后我们就可以了。当其他一些纯 Objective-C 类导入标头时,C++ 内容被隐藏,并且该类看不到任何特殊内容。这看起来像是一个黑客行为,有更好的解决方案吗?


这听起来像是接口/@协议的经典用法。为 API 定义 Objective-C 协议,然后使用 Objective-C++ 类提供该协议的实现。这样,客户端只需要了解协议,而不需要了解实现的标头。所以考虑到原来的实现

@interface Foo : NSObject
{
    id regularObjectiveCProperty;
    CPPClass cppStuff;

}

@end

我会定义一个协议

//Extending the NSObject protocol gives the NSObject
// protocol methods. If not all implementations are
// descended from NSObject, skip this.
@protocol IFoo <NSObject>

// Foo methods here
@end

并修改原来的Foo声明给

@interface Foo : NSObject <IFoo>
{
    id regularObjectiveCProperty;
    CPPClass cppStuff;
}

@end

然后客户端代码可以使用类型id<IFoo>并且不需要编译为 Objective-C++。显然你可以传递一个实例Foo给这些客户。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 类作为 Objective-C 类的实例变量 的相关文章

随机推荐