問題タブ [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.

0 投票する
5 に答える
3278 参照

c++ - 動的キャスト、オブジェクト変換のリスト、テンプレート

2 つのクラスがあります。

および汎用コンテナ

};

オブジェクトのコンテナが 4 つあります

これらの変換 (アップ/ダウン) は許可されていますか?

オブジェクトのリストを親オブジェクトのリストに、またはその逆に変換する方法はありますか?

更新された質問

reinterpret_cast はどうですか?

0 投票する
2 に答える
248 参照

c++ - C ++デザインの質問:テンプレートを介して関数を渡す?

読んでくれてありがとう。これは、適切な解決策があるという点で厄介な設計上の質問ですが、私があまり経験していないテンプレートを介したより良い方法がないかどうかという質問です。

保存する必要のある一連のタイプのデータテーブル(抽象クラ​​スDataTableから派生)があります。ベクトルDataTable*を格納し、すべてのDataTableIndexに共通の一般的な作業を処理する「DataTableIndex」抽象クラスを作成しました。ルックアップの実行、必要な場合にのみテーブルが読み込まれるようにするプロキシパターンの実装、エラーチェックなどです。

次に、テーブルタイプごとにサブクラス化します。これを行う必要がある唯一の理由は、テーブルタイプごとに、それをロードするために呼び出される特定の関数があるためです。

DataTableには多くのサブクラスがあるため、可能であれば、テンプレートを介してDataTableIndexのこのサブクラス化を避けたいと思います。

このクラスには非常に単純なサブクラスがあり、基本的には、データテーブルのファイルを実際に開いて解析するユーザーインターフェイスクラスの関数を指します。

これは適切に機能します。しかし、たとえば「loadTableTypeA」をテンプレートパラメータを介してDataTableIndexに渡すことができるはずなので、サブクラス化する必要はありません。

テンプレートを使用したいもう1つの理由は、DataTable*を常に実際のテーブルタイプにキャストする必要がないことです。コンパイル時にテーブルのタイプを知っていても、dynamic_cast <>を使用してエラーチェックを行う必要があるように感じますが、getTable()の呼び出し元が毎回これを実行する必要はありません(よく呼ばれます)。

私の理想的な解決策は次のとおりです。1)DataTableIndexクラスをテンプレートに一般化し、_lookupTableと_theTablesのLookupEntry*とDataTable*をテンプレートパラメーターで置き換えます。これにより、キャストが不要になります。

2)適切なUI関数をマップして、サブクラス化せずに適切なテーブルタイプをロードします。

だから基本的にはこのクラスを使ってこんな感じにしたいと思います(どういうわけか)

ポリシークラスについて考えましたが、そのアプローチの印象は、この場合、サブクラスを別のクラスに移動するだけであるということでした。

0 投票する
4 に答える
3100 参照

c++ - c++ dynamic_cast

「ベースから派生」キャストが間違っていることは知っています。しかし、その内部の理由は何ですか?内部の論理的な理由は何ですか?これ以上の説明なしにこれを思い出すのは難しいと思います。ありがとう!

0 投票する
3 に答える
2372 参照

c++ - クロスキャストが機能する可能性があるかどうかを確認しますか?

dynamic_castクラス階層全体で「クロスキャスト」を行うために使用することは合法であることを私は知っています。たとえば、次のようなクラスがある場合:

A*タイプのオブジェクトを指すポインタがある場合はC、次を使用できます。

私が指しているBベースオブジェクトへのポインタを取得します。C

C私がこれに言及する理由は、私が上記のコードを書いている時点で、コンパイラーがの定義を見たとしても、それがまだ見られていない可能性があるためAですBAこれは、コンパイラがとの間の接続を検出しない可能性があることを意味しますが、クラスが存在し、ある状況下で成功するB可能性があるため、とにかくコードをコンパイルする必要があります。Cdynamic_cast

問題は、これは、間違ったタイプのオブジェクトに誤ってクロスキャストする可能性があることを意味します。次のようなクラスがあるとします。

ここに、Dいくつかのランダムな無関係のクラスがあります。私がこのようなものを書こうとすると:

dynamic_castに接続する方法がないため、これは実行時に常に失敗します。を使用するつもりだったために誤って使用した場合、コンパイラは、意味のないキャストがあることをまったく示しません。ADDB

私の質問は、キャストが実行時に常に失敗することをコンパイラに警告させる方法はありますか? 言語レベルのソリューション、またはこれを検出できる主要なコンパイラーのコンパイラー設定に満足しています。外部ツールがある場合は、それでも問題ありません。このクラスのエラーをキャッチできるかどうかを知りたいだけです。

0 投票する
1 に答える
2533 参照

c++ - だから私はできません dynamic_cast< functionPointer >( ((void*)(myFuncPtr)) )? 私は何をすべきか?

基本クラスの Parameter と、2 つの派生クラス (Scalar & Vector) があります。各派生クラスには、関数ポインターを入力として受け取るメンバー関数があります。

Scalar クラスでは:

ベクトル クラスでは:

さまざまな戻り値の型に注意してください:doublestd::vector<double>. この関数を相互基本クラス Parameter 内で定義したいので、取る関数を変更し(void* input)、Scalar クラスと Vector クラス内で関数を定義するときに次のことを試しました。

samplerType inputSampler = dynamic_cast< samplerType >(input);

ただし、VS 2005 で次のエラーが発生します。

Grumble Grumble Grumble... これが C++ で有効かどうか (標準的に許可されている) かどうかはわかりませんが、いずれにせよ、これを私の設計上の欠陥として扱うことになると思います。

したがって、私の標準的なアプローチは、関数の戻り値の型で基本クラスをテンプレート化することですが、できません。基本クラス Parameter は、設計上、すべての型情報を含まないようにする必要があります。 継承を設計する別の方法はありますか?

これをグーグルで試してみたところ、関数ポインタは事実上ゼロになりました。したがって、これは実際には無効な構文であると思いますが、おそらく本当に、本当に珍しい設計上の課題にすぎませんか? これはそれらの場所の別の 1 つであり、救助へのファンクターですか?

0 投票する
2 に答える
2458 参照

c++ - 動的キャストスローポインタはstd::__non_rtti_objectではありません

dynamic_castに問題があります。プロジェクトをコンパイルし、デバッグモードですべてをテストしてから、リリースモードでコンパイルしてみました。現在、/ o2になっている最適化パラメーターを除いてデバッグモードからすべての構成をコピーしました(デバッグ中は/ odとして設定しました)。プロジェクトはコンパイルされましたが、リソースのロードを開始すると、ここのコードで例外が発生しました:

コードは何も変更されていません。デバッガーをチェックインすると、クラス内のすべての変数が本来あるべき姿になりますが、動的キャストはstd::__non_rtti_objectをスローします。私はそれを間違って何をしていますか?cocos2d-xを使用していますが、そのタグを追加するのに十分な評判がありませんでした。

0 投票する
1 に答える
2356 参照

c++ - dynamic_castの問題:typeidオブジェクトは等しくありませんが、名前は等しくなります

dynamic_cast期待した状況では機能しないことがわかりましたtypeid。実行時にオブジェクトを確認すると、状況がさらに不明確になります。ベースから派生へのキャストが欲しいだけですが、なぜそれが機能しないのか理解できません。

私は次のようなクラス構造を持っています:

私は(本質的に)std::vector<BoundaryCondition*>問題の一部の境界条件を表すaを持っています。私はそれを取得できるようにしたいので、その中vectorのすべてのMarshakBcオブジェクトについて、を呼び出しますchangeValueLaterOn。だから私は次のようなループを持っています

ベクトルに、、ReflectingBc*次に、が含まれている場合MarshakBc*、出力は次のようになります。

私はとについて何かを誤解していdynamic_castますtypeidか?

[の定義が上記のコードとは異なる翻訳単位にあり、テンプレートなどが含まれているため、実際の状況はこれよりも複雑ですBoundaryConditionが、上記のコードは私が行っていることと結果を非常によく表しています。取得。]


詳細

これが私の実際のルーチンです。これはファンクター内で使用されLoAnisoBc、派生クラスでBoundaryConditionTあり、基本クラスです。

そして、これが出力です


したがって、bcPtrs_構造と境界条件は1つのダイナミックライブラリにあり(つまり、Pythonでは1つのモジュールです)、のインスタンス化FillLoAnisoBcsは別のダイナミックライブラリにあります。エリックはこれを考えられる問題として提案し、私は同意します。

0 投票する
2 に答える
4336 参照

c++ - C++: 基本クラスと派生クラスのポインターの比較

このような場合にポインターを比較する際のベスト プラクティスに関する情報が欲しいです。