你能做一个C ++类的Objective-C ++子类吗?

时间:2012-04-04 19:15:11

标签: c++ objective-c macos

我正在研究的多平台应用程序使用单个C ++类的不同子类,具体取决于其运行的平台。我可以在不更改超类的情况下将OS X子类化为Objective-C ++(。mm)文件吗?

编辑:更多详情

该项目现在包含此文件层次结构:

* VideoDriver.cpp   - (superclass)
  - VideoDriver_OSX.cpp - (subclass, contains Mac implementation)
  - VideoDriver_win.cpp - (subclass, contains Windows implementation)
  - VideoDriver_X11.cpp - (subclass, contains Linux implementation)

简而言之,我希望能够在VideoDriver_OSX实现中使用Core Animation和其他Cocoa库。将其更改为Objective-C ++文件(VideoDriver_OSX.mm)允许我使用这些Cocoa库,但现在尝试实例化VideoDriver_OSX对象的代码行(在不同的文件中)导致运行时出现此动态链接器错误:

dyld: lazy symbol binding failed: Symbol not found: __ZN15VideoDriver_OSXC1EP10gui_info_sP6CPFifoI17DecodedVideoFrameE

这似乎与C ++名称修改有关,但我不知道如何解决它。伙计们,我非常感谢你的帮助。

3 个答案:

答案 0 :(得分:0)

.cpp文件重命名为.mm将在很多情况下起作用,因为Objective-C对象系统,语法和运行时或多或少与C ++对象系统,语法和运行。将.cpp重命名为.mm时,它不会将C ++对象神奇地转换为Objective-C对象,它们仍然是C ++对象。 .mm文件的作用是允许您在同一个文件中使用Objective-C和C ++对象,这是唯一可能的,因为Objective-C和C ++之间几乎没有任何对象系统,语法或运行时与每个对象冲突。其他

如果在Objective-C代码中使用名为new等的变量,转换为Objective-C ++会导致问题,因为这是C ++中的关键字。同样,在编译为Objective-C ++时,Objective-C中的任何关键字都不能在C ++代码中使用。

答案 1 :(得分:0)

“我可以在不更改超类的情况下使OS X子类成为Objective-C ++(。mm)文件吗?”

是。假设通过“子类Objective-C ++ ...文件”,你的意思是你的.cpp文件中的C ++类的objective-c ++代码子类中有一个C ++类。如果你想使用objective-c ++类作为你的C ++类的子类,那么你就不走运了。

答案 2 :(得分:-2)

没有Objective-C ++对象。在Objective-C ++文件中,您可以创建/使用Objective-C对象或C ++对象。对于桥接而言,最好的选择是组合 - 如果您要移植C ++框架以在Objective-C中使用,则创建对象:

  • 具有C ++对象的实例
  • 实现重定向到C ++对象的方法。

根据API的简单程度,这可能是也可能不是一件容易的事!