問題タブ [static-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++ - 基本クラスから派生クラスへの静的キャスト
私があなたの注意を引きたいと思うことがはっきりしないことがあります、それらのコードスニペットをチェックしてください:
不要なコードをすべて意図的に削除しました。以下のように定義されている、タイプ「city」への「this」ポインターの静的キャストを作成するコンストラクターを確認してください。
クラスに含めることができるものはここでは関係ないと思うので、クラスは意図的に空になっています。ここで何が起こっているのかを100%理解できないようにしたい場合、g ++ 4.7.2はコンパイル段階で警告やエラーを出力せず、「this_city」ポインターを使用するたびに、市のすべてのパブリックメンバーにアクセスできます。すべての変数が適切に初期化され、常に有効なデータが含まれているため、オブジェクト自体は一貫しているように見えます。
私が知りたいのは、construction_managementを単純な非テンプレートクラスとして定義した場合にこのコードが機能しないのはなぜですか?constからconst以外の都市へのポインタへの暫定的な変換が原因で、キャストが失敗します。なぜですか?
これはエラー印刷です:
そして、construction_managementがテンプレートである場合、なぜ機能するのでしょうか。これは一種のCRTPですか?
皆さん、ありがとうございました。
c++ - 同じパラメータータイプであるが定数修飾子が異なるstd::vectorのキャスト
質問は非常に単純です、それは一般的に安全な静的キャスト(または他のキャスト)から
に
バイナリに関しては、ネイティブタイプが異なる理由がわかりません。結局のところ、これconst
は要素のサイズに影響を与えない言語の制約であるため、
僕にできる
これが誰かのボートを沈めることを心配しないでください?またはこれは一般的に安全ではありませんか?
c++ - static_cast を使用して vtable のオーバーヘッドを回避できますか?
これが私の問題です。基本クラスと、基本クラスのいくつかのメソッドをオーバーライドする派生クラスがあります。簡単にするために、次の例を考えてみましょう。
私の実際のプログラムでは、これらのクラスは引数として他のクラスに渡され、他のメソッドで呼び出されますが、簡単にするために、基本クラスまたは派生クラスのいずれかを引数として取る単純な関数を作成してみましょう。私は単に書くことができます
適切な関数への呼び出しは、仮想関数により実行時に解決されます。
call_fn
ただし、が 100 万回呼び出されると (私の場合、実際のアプリケーションはシミュレーション実験であるため、そうなるでしょう)、回避したいかなりのオーバーヘッドが発生するのではないかと心配しています。
それで、 static_cast を使用して実際に問題に対処できるかどうか疑問に思っていました。多分このようなもの:
この場合、関数呼び出しはcall_fn<base>(obj)
、基本メソッドcall_fn<derived>(obj)
の呼び出しまたは派生メソッドの呼び出しとして行われます。
このソリューションは vtable のオーバーヘッドを回避しますか、それとも影響を受けますか? 返信ありがとうございます。
ところで、CRTP は知っていますが、あまり詳しくありません。そのため、最初にこの単純な質問に対する答えを知りたいのです:)
c++ - static_cast< > での C++ コンパイル エラー
以下は私のコードです
static_cast の実行中にコンパイル エラーが発生します。「someValue」配列の値を「A**& somenum」に割り当てようとしています。やり方を教えてください。
事前にどうもありがとうございました。
c++ - Pthreadとvoid*は、ジェネリックポインタの参照を解除しようとします
PRJをデバッグすると、次のエラーが発生します。
argsエラー:複数のエラーが報告されました。\ MIコマンドの実行に失敗しました:-var-create-
argsデバッガバックエンドからのエラーメッセージ:ジェネリックポインタを逆参照しようとしました。\変数オブジェクトを作成できません
void*argsからMapper*argにキャストするとエラーが発生します。
更新1
KMaster、KMapperは、それぞれMaster、Mapperを実装しますが、それらは何も追加しません。事実上、メソッドを呼び出すKMapperですwork()
。コードは次のとおりです。
誰かが助けてくれることを願っています!
更新2
デバッガーのスクリーンショット:
c++ - static_cast を使用した型変換が無効です。どの適切なキャストを使用すればよいですか?
I have a type definition のtypedef vector<Object*> ObjList;
I also have a function vector<BigObject*>* ObjectBox::getBigObjectList();
. BigObject
から継承されますObject
私がやりたかったのは、vector<BigObject*>*
fromを取得しgetBigObjectList()
て に変換することvector<Object*>*
です。これは上向きのキャストであり、この型は として定義されているObjList
ので、基本的にそれを型に変換したかったのObjList
です。
私は2つの方法を試しました.1つ目は
これはコンパイルされ、この記事 ( When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used? ) から読みました。reinterpret-cast
次にstatic_cast
、を使用しようとしましたが、無効な型変換というエラーが表示されました
これもうまくいきません
なぜこれが機能しないのですか?これは、ネストされたクラスではなくstatic_cast
直接クラス (それ自体など) をキャストするためにのみ使用できるためObject
ですか (ここでは完全に推測しています)。この場合、どうすればよいですか?
c++ - double から const int への C++ の型キャストが正しく機能しない
const int 型の変数がありますが、依存しているパラメーターは double 型です。これを「double」から「const int」にキャストしようとすると、正しく機能しません。たとえば、N が 991 のはずなのに、990 と入力されます。いくつかの方法を試しましたが、1 つしか機能しませんでしたが、この方法が常に機能するかどうかはわかりません。ここに私が試したいくつかの方法があります:
最初の方法:
2 番目の方法:
3 番目の方法:
4 番目の方法 (作業方法のみ):
dx は、(Ls-1)/dx の余りが常にゼロになるような値であることに注意してください (つまり、常に整数値です)。型キャストをよりよく理解できるように、他の方法が機能しない理由をとにかく説明できますか?
編集: 要求に応じて、コード全体をアップロードして、すべてがどのように機能しているかを示します。
c++ - 実行時の型識別に dynamic_cast を使用する
Essential c++ の章 5.10 ランタイム タイプの識別を読んでいるときに、問題が発生しました。最初に少し背景を紹介させてください。という名前の基本クラスとから派生しnum_sequence
たクラスがあります。基本クラスには名前付きの仮想関数があり、派生クラスには独自の定義があります。Fibonacci
num_sequence
gen_elems
以下、本より。
gen_elems() の Fibonacci インスタンスが呼び出されることがわかっています。ただし、このテストから ps が Fibonacci クラス オブジェクトをアドレス指定することがわかっていますが、ps を介して gen_elems() の Fibonacci インスタンスを直接呼び出そうとすると、コンパイル時エラーが発生します。
ps->フィボナッチ::gen_elems(64); //コンパイル時エラーが発生する
ps は、それがアドレス指定するオブジェクトのタイプを知りません。たとえ、私たちと typeid および仮想関数メカニズムが知っていたとしてもです。
gen_elems() の Fibonacci インスタンスを呼び出すには、Fibonacci
ps
型のポインターに変換するようにコンパイラーに指示する必要があります。static_cast と dynamic_cast の両方がこの仕事を行うことができます。
太字で迷っています。ps->gen_elems(64)
のフィボナッチ インスタンスを実際に呼び出しますgen_elems()
。static_cast と dynamic_cast を使用して、それをフィボナッチ型のポインターに変換する必要があるのはなぜですか?
c++ - クラスを整数に静的にキャストできない
element* を int に静的にキャストしようとするとエラーが発生するのはなぜですか
c++ - static_castまたはINT64_Cを使用して、64ビット定数を移植可能に割り当てる必要がありますか?
64ビット定数をとして割り当てる
必ずしもポータブルでlong long
はないため、ポータブルではありませんint64_t
。この投稿どの初期化子がint64_tに適していますか?INT64_C()
からのマクロの使用について説明しますが、として<stdint.h>
使用することもできませんstatic_cast
?
どちらを選ぶべきか、そしてその理由、または両方ともうまく機能しますか?
static_cast
インターネットとSOで検索しましたが、オプションが検討されている場所は見つかりませんでした。sizeof()
また、単純なケースで機能することを確認するためにを使用してテストを行いました。