我正在研究的多平台应用程序使用单个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 ++名称修改有关,但我不知道如何解决它。伙计们,我非常感谢你的帮助。
答案 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中使用,则创建对象:
根据API的简单程度,这可能是也可能不是一件容易的事!