問題タブ [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++ - dynamic_cast は NULL を返しますが、そうすべきではありません
私は次のクラス階層を持っています:
私は QT を使用しており、QtPlugin を使用して (自分のアプリ用に) プラグインを作成しようとしています。DASQLiteStorage のインスタンスを作成し、このインスタンスをプラグイン内のオブジェクトに渡します。
問題は、dynamic_cast がヌル ポインターを返す (予期しない) ことですが、メイン アプリ内で (つまり、"gateway->setDefaultStorage(storage);" の前に) dynamic_cast を実行すると、有効なポインター (予期される) が返されます。
なぜこれが起こるのか誰にも分かりますか?プログラムはプラグインとは異なるメモリ範囲で動作していますか? これはそのような問題につながる可能性がありますか? これを修正する方法はありますか?
どうもありがとう!
編集:いくつかの提案を試しました:
メソッドの最初の行では、s は NULL に等しく、2 番目の s には正しいポインターが含まれ、3 番目には別のポインターが含まれます。これらのポインターが等しくないのはなぜですか?
そして、私が現在使用しているにもかかわらず、なぜdynamic_castがまだ機能しないのですか:
EDIT2:コードでもう少し進んだセグメンテーション違反もこれに関連していることに気付きました。私は次の構造を持っています:
これらのセグメンテーション違反は発生すべきではありませんか? しかし、なぜ彼らはそうするのですか?
c# - C#で動的な暗黙の型キャストを行う方法はありますか?
暗黙のキャスト演算子を使用してこのクラスを指定すると、次のようになります。
次のことができるようになりました。
ただし、次のことはできません。
これにより、コンパイル時間が得られます。
タイプ 'object' を 'MyDateTime' に暗黙的に変換することはできません。
私には理にかなっています。
ここで、前の例を次のように変更します。
これはうまくコンパイルされます。今、私はランタイムを取得しますInvalidCastException
:
'System.Int64' 型のオブジェクトを MyDateTime 型にキャストできません。
これは、C# の暗黙的なキャスト演算子がコンパイル時にのみ適用され、.NET ランタイムがオブジェクトを別の型に動的にキャストしようとしているときには適用されないことを示しています。
私の質問:
- 私は正しいですか?
- これを行う他の方法はありますか?
ところで、完全なアプリケーションはDelegate.DynamicInvoke()
、パラメーターを受け取る関数を呼び出すために使用しているMyDateTime
もので、渡す引数の型はDynamicInvoke
long です。
java - java:ある型から別の型への変数の動的キャストを行うにはどうすればよいですか?
Java 変数の動的キャストを行いたいのですが、キャスト タイプは別の変数に格納されています。
これは通常のキャストです:
これは私が欲しいものです:
これは可能ですか?ありがとう!
アップデート
HashMap
受け取った をクラスに入力しようとしています。
これはコンストラクタです:
ここでの問題は、クラスの変数の一部が 型Double
であり、数値 3 が受信された場合、それが と見なされ、Integer
型の問題があることです。
c++ - dynamic_cast でのテンプレート推定
次のように定義されたクラスがあります。
関数内で私はこれをやっています:
タイプを解決しCometWidget
、準拠して正しく実行します。
コードはCometWidget
クラス内で実行されます。
一体どうしてこれが起こるのですか?
どうしてこんなことに?コンパイルする必要がありますか?
c++ - C++ の dynamic_cast と static_cast
dynamic_cast
C++のキーワードにかなり混乱しています。
定義は次のように述べています。
キーワードは、
dynamic_cast
あるポインターまたは参照型から別の型にデータをキャストし、ランタイム チェックを実行してキャストの有効性を確認します。
dynamic_cast
物事をよりよく理解できるように、C++ に相当するものを C で書くことはできますか?
c++ - dlopen/dlsym で使用すると、dynamic_cast が失敗する
はじめに
長い質問を前もってお詫び申し上げます。できる限り短くしていますが、残念ながらそれほど短くはありません。
設定
A と B の 2 つのインターフェイスを定義しました。
次に、クラス C のオブジェクトを構築し、A と B の両方を実装してから、それらの A インターフェイスへのポインタを渡す共有ライブラリ「testc」があります。
最後に、2 番目の共有ライブラリ「testd」があります。これは、A*
入力として を受け取り、それを にキャストしようとしますB*
。dynamic_cast
最後に、メイン アプリケーションA*
があり、ライブラリ間で 'sを渡します。
質問
「testc」および「testd」ライブラリにリンクしてメイン アプリケーションをビルドすると、すべてが期待どおりに機能します。ただし、「testc」および「testd」に対してリンクしないようにメイン アプリケーションを変更し、代わりにdlopen
/を使用して実行時にロードするとdlsym
、dynamic_cast
失敗します。
私はなぜなのか理解していない。手がかりはありますか?
追加情報
- gcc 4.4.1、libc6 2.10.1 (Ubuntu 9.10) でテスト済み
- サンプルコードが利用可能
c++ - 任意の型の与えられた引数を使用して任意の操作を行うための提案はありますか?
基本的には、任意の型の引数を使用して任意の操作を実行したいだけです。
引数タイプの基本クラスはVarであり、Operationは、指定された引数に対して実行される操作の基本クラスです。
opIdを使用してマップされた演算子のコレクションを保持するEvaluatorクラスがあります。Evaluatorは、evaluate()メンバー関数で指定されたopId引数に基づいて操作を実行し、evaluate()関数は、引数の型とopIdを受け入れるサポートされている演算子を検索します。
私が聞きたいのは、dynamic_cast<>や演算子コレクションのループなしでこれを行う効率的なパターンやアルゴリズムはありますか。
`
`
c# - オブジェクトの動的キャスト
こんにちは、プロパティ リフレクション情報に基づいて、2 つのオブジェクトを特定の型にキャストしようとしています。これを動的に実行したいので、2 つのオブジェクトをこのクラスに含めることができるタイプごとに多数のスイッチ ケースなどを必要としません。全体として、それらはほとんど int または float になります。現時点では、「var」および「object」キーワードを使用して、入力された調整値とプロパティの元の値を保持しようとしました。
入力調整値は文字列ですが、'int' または 'float' 形式のいずれかであるため、簡単に変換できます。これはすべて正常に機能します。問題となるのは、元の値を新しい調整値で調整できるキャストだけです。
私は.NET 4.0でこのようなことを達成できる「動的」キーワードがあることを知っていますが、現在私は3.5を使用して立ち往生しています。
どちらのオブジェクトも、プロパティ情報 propInfo.GetType() の型を使用します。
これに関するヘルプは大歓迎です。おそらく、これを達成するためにここで基本的なことを見落としていると思います。前もって感謝します。
-CK
編集:
言い忘れましたが、申し訳ありませんが、これは Zune HD で開発されているため、アクセスできるフレームワークは、使用できる/できないものにかなり制限されています。
interface - ポリモーフィズムの問題:派生クラスの型を確認するには?
これは私の最初の質問です:)
オブジェクト タイプをチェックするのではなく、代わりに dynamic_cast を使用する必要があることはわかっていますが、それでは問題は解決しません。
Extension というクラスと、IExtendable および IInitializable、IUpdatable、ILoadable、IDrawable というインターフェイスがあります (最後の 4 つは基本的に同じです)。Extension が IExtendable インターフェイスを実装している場合、さまざまな Extension オブジェクトで拡張できます。
問題は、IExtendable を実装する Extension を、元の Extension と同じインターフェイスを実装する Extension でのみ拡張できるようにしたいことです。
あなたはおそらくその混乱を理解していないので、コードで説明しようとします:
次に、次のような拡張機能を作成する場合を想像してください。
そして、このクラスが同じ (またはそれ以下の) インターフェースを実装する拡張機能でのみ拡張できるようにしたいと考えています。たとえば、IUpdatable を実装する Extension を使用できるようにしたいと考えています。または IUpdatable と IDrawable の両方。しかし、例えば、ILoadable を実装する Extension ではありません。たとえば、IExtendable と IUpdateable を実装する拡張機能で Update() が呼び出されると、この拡張機能を拡張するこれらの拡張機能でも呼び出されるため、これを行います。
したがって、IExtendable と IUpdatable、ILoadable の一部を実装する Extension に Extension を追加するときは、追加する Extension がこれらのインターフェイスも実装しているかどうかを確認する必要があります。したがって、 IExtendable::AddExtension(Extension*) では、次のようにする必要があります。
しかし、どのように?最善の解決策は何ですか?dynamic_cast を使用したくなくて、それが null を返すかどうかを確認したくありません... ありがとう
c++ - ベースクラスポインタC++からのサブクラスメンバーへのアクセス
カスタムクラスのStudentオブジェクトの配列があります。CourseStudentとResearchStudentはどちらもStudentを継承しており、Studentのすべてのインスタンスはこれらのいずれかです。
配列を調べて、各Studentのサブタイプを判別し、それらに対してサブタイプ固有のメンバー関数を呼び出す関数があります。
問題は、これらの関数がオーバーロードされていないため、Studentで見つからないため、コンパイラーが大騒ぎすることです。
Studentへのポインターがある場合、そのStudentのサブタイプへのポインターを取得する方法はありますか?コンパイル時のエラーを回避するために、ここで何らかの偽のキャストを作成する必要がありますか?