2012-04-04 9 views
1

私が取り組んでいるマルチプラットフォームアプリケーションは、実行しているプラ​​ットフォームに応じて、単一のC++クラスの異なるサブクラスを使用します。スーパークラスを変更せずにOS XサブクラスをObjective-C++(.mm)ファイルにすることはできますか?C++クラスのObjective-C++サブクラスを作ることができます

編集:詳細

プロジェクト、それが今、このファイルの階層が含ま立つよう:要するに

* 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

おかしい、私はこれを行う方法の例で、以前同様の質問をしました:http://stackoverflow.com/questions/10014684/objective-c-disadvantages-to-bridging-with-c –

+1

OS XサブクラスをObjective-C++(.mm)ファイルにする "< - これは意味をなさない。 –

+0

エラーの原因となったコード行を記載してください。 – mydogisbox

答えて

-2

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

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

APIがどれほどシンプルであるかによって、これは簡単な作業かもしれません。

+0

"Objective-C++オブジェクトのようなものはありません。"正しいものではありません。 objective-C++では、objective-cクラスはなく、C++クラスとobjective-C++クラスのみが存在します。 – mydogisbox

+1

私は同意しません。単純なObjective-CコードでObjective-C++ファイルで定義されたクラスを使用でき、Objective-CにはObjective-C++に関する知識がありません。そのクラスはObjective-Cクラスです。このクラスの実装では、C++オブジェクトを使用できるという事実は、インタフェースには影響しません。 – joerick

+1

もちろん可能です。 Cの実装ファイルでC++の構造体を使うことができるのと同じように(これはobjective-cクラスのベースなので)それはC++コードで定義された "客観的な"クラスがC++の拡張ではないということを変えていません。 – mydogisbox

0

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

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

+0

技術的に言えば、objective-C++クラスはありません。すべてobjective-C++クラスです。より明確に言えば、これは、objective-C++をコンパイルするときに、「目的」クラスがC言語のクラスではなくC++のクラスにコンパイルされることを意味します。 – mydogisbox

+1

@mydogisbox:あなたは冗談ですか?あなたはそれを聞いたのですか?あなたはひどく誤解されています。そうでなければ、Objective-Cランタイムまたはclangコンパイラソースで指摘してください。 – dreamlax

+0

@mydogisbox:Objective-Cクラスは、Objective-C++としてコンパイルされたときにObjective-Cクラス以外のものにコンパイルされません。そうしないと、既存の* non * -Objective-C++クラスと相互に作用しません。 – dreamlax

0

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

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

関連する問題