問題タブ [dynamic-cast]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - ダイナミックキャスティングの「良い使い方」の例は何ですか?
ダイナミックキャスティングは避けるべきだとよく耳にします。あなたによると、私はそれの「良い使い方」の例は何でしょうか?
編集:
はい、私はその別のスレッドを知っています:私が質問したのは、そこで最初の答えの1つを読んだときです!
c++ - c++ dynamic_cast エラー処理
dynamic_cast のエラー処理に関連する適切な方法はありますか (必要がない場合は使用しないことを除く)。NULL と bad_cast をスローする方法を考えています。両方をチェックする必要がありますか?そして、bad_cast をキャッチしたり NULL を検出したりした場合、おそらくとにかく回復できません... 今のところ、assert を使用して、dynamic_cast が NULL 値ではない値を返したかどうかを確認しています。コードレビューでこの解決策を受け入れますか?
c++ - dynamic_castがクラッシュする原因は何ですか?
私はこのようなコードを持っています:
時々それはクラッシュします:
なぜクラッシュするのかわかりません。objはnullではありません(もしそうなら問題ではないでしょうか?)。
ダイナミックキャストがクラッシュする理由は何でしょうか?
キャストできない場合は、NULLを返す必要があります。
c++ - 変数の型を安全にチェックする
システムの場合、ポインターを long に変換してから long をポインター型に戻す必要があります。ご想像のとおり、これは非常に危険です。私がやりたかったのは、変換を行うために dynamic_cast を使用することです。それらを混合すると、null ポインターが得られます。このページにはhttp://publib.boulder.ibm.com/infocenter/lnxpcomp/v7v91/index.jsp?topic=/com.ibm.vacpp7l.doc/language/ref/clrc05keyword_dynamic_cast.htmと書かれています
dynamic_cast オペレーターは、実行時に型変換を実行します。dynamic_cast 演算子は、基本クラスへのポインターから派生クラスへのポインターへの変換、または基本クラスを参照する左辺値から派生クラスへの参照への変換を保証します。これにより、プログラムはクラス階層を安全に使用できます。この演算子と typeid 演算子は、C++ でランタイム型情報 (RTTI) をサポートします。
nullの場合はエラーを取得したいので、独自の動的キャストを作成しました
MSVC を使用すると、「エラー C2681: 'long' : dynamic_cast の無効な式タイプ」というエラーが表示されます。これは、仮想関数を持つクラスでのみ機能することがわかりました... WTF! 動的キャストのポイントがアップ/ダウン キャストの継承の問題であることは知っていますが、型キャストの問題を動的に解決することも考えていました。reinterpret_cast を使用できることはわかっていますが、同じタイプの安全性は保証されません。
タイプキャストが同じタイプかどうかを確認するには、何を使用すればよいですか? 2 つの typeid を比較することはできますが、派生をそのベースに型キャストしたい場合に問題が発生します。では、どうすればこれを解決できますか?
c++ - インターフェイスを使用した動的キャスト
2 つのインターフェイスを実装し、1 つのクラスを継承するクラスがあります。したがって、一般的には次のようになります。
コードには がありますが、IB *
実際には を使用できるポイントが 1 つありA *
ます。私は動的キャストがこれを好むことを望んでいました:
残念ながら、これは機能しません。これを行う適切な方法はありますか?または、回避策を実装する必要がありますか? IB
と の両方をIC
仮想的に継承することを考えましA
たが、前回 IIRC を試してみたところ、いくつかの複雑さが望ましくないことがありました。
何かご意見は?
編集:そうそう、これはプラグイン API の一部であるため、残念ながら、T
必要なタイプに直接アクセスすることはできませんA *
。私の例は隣り合っていますが、前述のように、より複雑です。基本的に、2 つの共有ライブラリがあります。T
とT1
(私が持っている場所IB *
) は両方とも、プラグイン API を実装し、共有ライブラリの内部にあるクラスです。
明確にするために:これは私の典型的なプラグインのより具体的な例です(それらは別々のライブラリにあります):
プラグイン A:
プラグイン B:
編集: 問題は、pluginA と pluginB が異なる共有ライブラリにあることだと思います。おそらく、rtti はモジュールの境界を越えていません。私のテストでは人々の例がうまく機能しているように見えるので、これが当てはまるかもしれないと思います。具体的には、「nm」を実行すると、pluginB には「PluginA の typeinfo」がありません。これが問題の核心かもしれません。この場合は、仮想継承またはcast_to_qobject()
インターフェイスの 1 つで仮想関数を使用して回避する必要があります。
c++ - C++ コードで dynamic_cast を回避するにはどうすればよいですか?
次のクラス構造があるとします。
Car
その へのハンドルも与えましょうEngine
。はFooCar
で作成されFooEngine*
、BarCar
は で作成されBarEngine*
ます。オブジェクトがダウンキャストせずにFooCar
メンバー関数を呼び出せるように配置する方法はありますか?FooEngine
クラス構造が現在のようにレイアウトされている理由は次のとおりです。
- すべて
Car
の にはEngine
. さらに、 aFooCar
は a のみを使用しFooEngine
ます。 Engine
コピーして貼り付けたくない、すべてのユーザーが共有するデータとアルゴリズムがあります。Engine
がその について知る必要がある関数を書きたいと思うかもしれませんCar
。
dynamic_cast
このコードを書いているときに入力するとすぐに、何か間違ったことをしている可能性があることがわかりました。これを行うより良い方法はありますか?
アップデート:
これまでの回答に基づいて、私は次の 2 つの可能性に傾いています。
- 純粋
Car
な仮想getEngine()
関数を提供する必要があります。これにより、正しい種類の を返す実装が可能FooCar
になります。BarCar
Engine
Engine
すべての機能をCar
継承ツリー に吸収します。Engine
メンテナンス上の理由で(Engine
別の場所に保管するため)壊れていました。これは、小さなクラス (コード行が小さい) を増やすか、大きなクラスを減らすかのトレードオフです。
これらのソリューションのいずれかに対するコミュニティの強い好みはありますか? 私が考慮していない 3 番目のオプションはありますか?
c# - C#: 動的に型をキャストする
私は現在、このタイプのコードを持っています:
SomeClassType1 と SomeClassType2 に割り当てたい同じプロパティ セットがあると仮定すると (他のプロパティでは異なる場合があります)、MainObject を適切な型に動的にキャストし、コードを複製せずに値を割り当てることは可能ですか? これは私が最後に見たいものです:
そして明らかに、C# は DynamicType を見つけることができないと不平を言っています:
型または名前空間名 'DynamicType' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)
このようなことは C# 2.0 で可能ですか? 現在のコードよりも厄介な場合は、これを行う意味がないと思いますが、調べることに非常に興味があります。ありがとう!
編集:明確にするために、インターフェースを実装することが最も適切で、おそらく正しい解決策であることを完全に理解しています。とはいえ、インターフェースを実装せずにそれを行う方法を知りたいと思っています。素晴らしい返信をありがとう!
c++ - サブクラスを区別するにはどうすればよいですか
次のようなトークン クラスがあります。
したがって、本質的には、すべてのサブクラスを Token クラスで定義する必要があります。サブクラスが非常に少なく、それらが変更されるとは想像できないため、それほど悪い結果にはなりません。それでも、動的キャストを使用してサブクラスを識別するよりも、醜く、ぎこちなく、「正しく」ありません。でも:
また、かなり不器用です。特に、ネストされた大きな if でそれらをつなぎ合わせる必要がある場合。
それで、あなたはどちらを使いますか?この問題の別の解決策はありますか?
注:とにかく、それぞれのデータを取得するにはそれらをキャストする必要があることはわかっていますが、
- 関数を使用する直前までキャストしないので、すっきりと感じられます。
- 私はそれらのデータを使用するよりもはるかに頻繁にそれらの型をテストします。
注 2:上記のコードでは、これらのトークンがリンクされたリストでもあることは示されていません。これにより、テンプレート化が困難になります( aToken<int>
が a を指す場合Token<string>
など)。これが、最初に親として Token クラスが必要な理由です。
c++ - dynamic_cast が失敗する
基本クラスと派生クラスがあります。各クラスには、.h ファイルと .cpp ファイルがあります。
次のコードで、基本クラス オブジェクトの派生クラスへの dynamic_cast を実行しています。
h ファイル:
cpp ファイル:
奇妙な理由から、キャストは失敗します (NULL を返します)。ただし、派生クラスのコンストラクターの実装を .h から .cpp ファイルに移動すると、キャストは成功します。
何が原因ですか?
Linux-SUSE のコンパイラは gcc 3.1 です。ところで、この動作はこのプラットフォームでのみ見られ、同じコードは Visual Studio でも正常に動作します。