建议在Cocoa应用程序中使用大型C ++库的方法?

时间:2012-04-14 18:19:00

标签: c++ objective-c c objective-c++

我正在尝试开发一个可以“堆叠”FITS图像的应用程序。要读取FITS图像,我可以使用CCFits(C ++库)或CFITSIO(A C库) - 没有原生的Objective-C库。

我更喜欢使用CCFits,因为它允许面向对象的设计,我希望能让我更好地组织程序。我已经尝试过使用CFITSIO,但一段时间后它变得相当笨拙(当然,这可能是因为我在开发大型应用程序方面缺乏经验)。

总的来说,最好的方法是什么?我应该为CFITSIO函数编写包装器并编写自己的类吗?有没有办法在Objective-C中使用C ++类 - 该库包含很多类,我知道我可以使用不透明指针来包装类,但是如何保留类继承之类的东西呢?我是否必须手动将Objective-C中的类子类化并将子类包装在那里?

3 个答案:

答案 0 :(得分:3)

您可以使用Objective-C ++轻松混合C ++和Objective-C。在XCode中,只需将.m文件重命名为.mm,它就会将文件识别为Objective-C ++。然后,您可以在Objective-C代码中使用C ++类(some restrictions apply,但不是很多)。

由于Objective-C是C的扩展,因此您可以轻松地在任何Objective-C程序中使用C库。

答案 1 :(得分:2)

正如@myrkos所说,混合C ++和Objective-C很容易。 但请务必仔细阅读两种语言的互动方式。 特别是你不能从C ++类继承Objective-C类,反之亦然(你似乎在你的问题中暗示)。

这在实践中通常不是问题。

然而,它们组合得非常好(也就是说,你可以将Objective-C对象作为C ++类的成员,反之亦然 - 只要它都在.mm文件中)。 如果您将C ++对象作为Objective-C类按值的ivar,那么将自动为您调用构造函数和析构函数。

答案 2 :(得分:0)

  

总的来说,最好的方法是什么?

使用您熟悉的变体(CCFits)。

  

我应该为CFITSIO函数编写包装器并编写自己的类吗?

没有

  

有没有办法在Objective-C中使用C ++类 - 该库包含很多类,我知道我可以使用不透明指针来包装类,但是如何保留类继承之类的东西?

Objective-C ++允许您在相同的翻译中使用C,Objective-C和C ++程序,几乎没有问题。因此,您的实现可以根据需要混合使用Cocoa和C ++。 C ++类可以包含ObjC类型,而ObjC类型可以包含C ++类型。

  

我是否必须手动将Objective-C中的类子类化并将子类包装在那里?

按原样使用CCFits库。将它包装在ObjC类型中,以及很多时间丢失,几乎没有什么好处。

如果你想在某些领域坚持使用严格的ObjC,那么你需要学习如何隐藏ObjC接口背后的C ++类型(不是包装器接口 - 只是你的应用程序使用CCFits的高级接口)。 / p>