Objective-C++对C++的支持程度如何?

6

我想开发一个iPhone应用,但是我打算用C++来制作框架。在Objective-C++中是否可以使用诸如模板之类的东西?我想问题实际上是,我能否使用boost库?


这可能不是一个很有帮助的答案,但如果你已经了解了C++,学习Objective-C应该很容易。当然,除非你正在移植一个应用程序,那么我更理解这个问题。 - Sean
当你需要非常高的性能,比如在游戏引擎中时,使用C++是有意义的。 - Chris Lundie
6个回答

13

可以在Objective-C++中使用模板等东西,但是需要注意在纯C++层和Objective-C++代码之间混合类型和接口的方式。请记住层之间的边界,在那里您需要转换类型,例如将std::string转换为NSString等。

例如,您可以在纯C++中实现核心游戏引擎,只需在Objective-C++中实现控制器和GUI代码即可。然后Obj-C++代码是纯C++引擎和Cocoa之间的粘合剂。

我猜问题真正的问题是,我可以使用boost吗?

由于iPhone OS是OS X的子集,仍提供完整的POSIX层,因此大多数Boost库应该可以正常工作。这就像编写Darwin代码一样简单。

有一些需要注意的Objective-C++限制(直接摘自Objective-C 2.0参考指南):

  • 你不能使用Objective-C语法来调用C++对象
  • 你不能为Objective-C对象添加构造函数或析构函数
  • 你不能将关键字this和self互换使用
  • 类层次结构是分开的;C++类不能继承Objective-C类,Objective-C类也不能继承C++类
  • 在Objective-C代码中抛出的异常无法在C++代码中捕获,反之亦然。

1
如果你要对一个答案进行负评,最起码也要说明原因。目前被接受的答案(目前有9个赞)过于简单地陈述了C++的所有特性都是可用的。而这个回答则是有条件地肯定,并直接引用语言参考中解释限制的内容,结果却被负评了。这是怎么回事? - gavinb
限制 #2 像一般的 C++ 方法一样添加到 Objective-C 类中。但很难相信将 C++ 方法添加到 Objective-C 类是可能的。能否详细解释一下?因为链接已经失效,我无法进行更多的检查。 - eonil
1
很遗憾,我找不到一个等价的文档来替换上面的内容。我已经向ADC文档团队发送了一条消息,请求恢复它。第二点简单地意味着,在.mm模块中的ObjC类仍然具有相同的initdealloc方法用于生命周期管理;你只是不能在同一个类中混合使用ObjC和C++方法。你不能将C++方法添加到ObjC类中,但你可以在.mm中在两者之间调用。希望这能澄清上述内容。 - gavinb

10

Objective C++支持全部的C++语法。使用boost库应该是可行的,但可能需要移植一些平台相关的内容。


2
我使用了Boost而没有进行任何修改。它可以直接使用,非常好用。 - John Smith
1
主要的 Boost 库应该可以工作,但一些与 IO 相关的库可能不能直接使用。 - Zifre

4

需要指出的是,你不能在Objective-C++中像C++一样做任何事情。例如,你不能从Objective-C类调用C++对象上的虚函数。但是,一旦你调用了C/C++函数,你可以做任何你想做的事情。


我不相信这是正确的。你可以在Objective-C++代码中调用C++虚方法。 - Barry Wark
Objective-C++也同样努力让C++类实例作为实例变量。只要涉及的C++类(以及其所有父类)没有定义任何虚成员函数,这是可能的。如果存在任何虚成员函数,则该C++类不能作为Objective-C实例变量。在较新版本的操作系统中似乎不再是问题,但我认为在iPhone操作系统上仍然存在这个问题。 - Caleb Vear

3

Objective C++是C++的超集。在Obj-C++中,您可以做C/C++中能做的任何事情。 "Objective"部分包含了类似Smalltalk的消息传递系统和其他对C++的扩展。


2

在Objective C中,C++对象不一定会像在C++中那样表现。例如,构造函数和析构函数不会自动调用,并且(我认为)您无法实现虚拟方法...


1

Boost很有用,但是也会给项目增加很大的开销。

在添加它之前,请确保您真的需要它。

关于正则表达式支持:RegexLite

其他所有功能使用:Cocoa


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接