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)

つまり、Core Animation やその他の Cocoa ライブラリを VideoDriver_OSX 実装で使用できるようにしたいと考えています。これを 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

.cppObjective-Cオブジェクトシステム、構文、およびランタイムは、C ++オブジェクトシステム、構文、およびランタイムとは多かれ少なかれ異なるため、ファイルの名前をに変更する.mmと、多くの場合に機能します。aの名前をに変更し.cppても.mm、C ++オブジェクトが魔法のようにObjective-Cオブジェクトに変わることはなく、C++オブジェクトのままになります。ファイルが行う.mmことは、同じファイルでObjective-CオブジェクトとC ++オブジェクトの両方を使用できるようにすることです。これは、Objective-CとC ++の間のオブジェクトシステム、構文、またはランタイムが互いに衝突しないためにのみ可能です。

Objective-C ++への変換は、Objective-Cコードでetcと呼ばれる変数を使用する場合に問題を引き起こす可能性がありますnew。これは、C++のキーワードであるためです。同様に、Objective-Cとしてコンパイルする場合、Objective-CのキーワードをC++コードで使用することはできません。

于 2012-04-04T20:43:18.830 に答える
0

「スーパークラスを変更せずに、OS X サブクラスを Objective-C++ (.mm) ファイルにすることはできますか?」

はい。「目的の C++ ... ファイルをサブクラス化する」とは、目的の c++ コードに C++ クラスがあり、.cpp ファイルの C++ クラスをサブクラス化することを意味します。Objective-C++ クラスを C++ クラスのサブクラスとして使用したい場合は、運が悪いです。

于 2012-04-04T21:04:13.543 に答える
-2

Objective-C++ オブジェクトのようなものはありません。Objective-C++ ファイルでは、Objective-C オブジェクトまたは C++ オブジェクトを作成/使用できます。ブリッジングの最善の策は構成です。C++ フレームワークを移植して Objective-C で使用する場合は、オブジェクトを作成します。

  • C++ オブジェクトのインスタンスを持つ
  • C++ オブジェクトにリダイレクトするメソッドを実装します。

API がどれほど単純かによって、これは簡単な作業になる場合とそうでない場合があります。

于 2012-04-04T19:33:04.837 に答える