1

我正在开发的多平台应用程序使用单个 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++ 名称修饰有关,但我不知道如何解决它。我真的很感谢帮助,伙计们。

4

3 回答 3

0

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

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

于 2012-04-04T21:04:13.543 回答
0

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

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

于 2012-04-04T20:43:18.830 回答
-2

没有 Objective-C++ 对象这样的东西。在 Objective-C++ 文件中,您可以制作/使用 Objective-C 对象或 C++ 对象。桥接的最佳选择是组合 - 如果您要移植 C++ 框架以在 Objective-C 中使用,请创建对象:

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

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

于 2012-04-04T19:33:04.837 回答