問題タブ [object-slicing]
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++ - 基本クラスに降格せずに * オブジェクトのベクトルを作成する方法
私のclass
実装では、次のようなものがあります。
基本クラス
派生クラス
私はこのようないくつかの作業オプションを知っています:
を作る
のタイプとして
しかし、私のコードはバインドされstd::shared_ptr
、次のような単純な構文を作成できません:
使用例:
main.cpp
アップデート:
これは一時的な定義ですswcApplication::Controls::add()
が、まだ異なる場合があります
c++ - C++ での 2 次元配列内でのオブジェクトのスライス
こんにちは、配列に格納されている派生型を失うことなく、基本型の 2 次元配列内に派生型オブジェクトを格納することに小さな問題があります。
たとえば、次の Base クラスと Derived クラスがあります。
次のように Base オブジェクトを作成するポイントがあります。
次に、次のように、上記のオブジェクトを Derived クラスの型にキャストします。
この時点で、すべてが正しく機能しています (derivedPointer の型を出力すると、それは Derived 型です)。
これで、タイプ Base クラスの 2 次元配列が次のように初期化されました。
ここで、次のように、derivedPointer 値を配列に入力します。
これは、referencePointer に格納するときに問題が発生する場所ですが、Base 型 (オブジェクトのスライス) になり、referencePointer 値を格納してその型を Base 型の配列内に保持する方法がわかりません。
どんな助けでも大歓迎です、
ありがとうございました!
c++ - 抽象基本クラスを使用したファクトリ パターン - 参照または値による戻り値? スコーピングとスライスの問題
以下のコード サンプルに似た型階層があり、ファクトリ パターンを介してインスタンス化しようとしています (または、ファクトリは XML ドキュメントから入力を取得するため、より詳しく言えばビルダー パターンを使用します... しかし、私は余談)。
しかし、私はこれをやろうとしていますが、値で返す場合はスライスするか、参照で返す場合はスコーピングが原因であると思われる問題に遭遇しています。
たとえば、以下のプログラムは、a.doA()
内の行で segfault を実行しますC::doStuff()
。value_C_factory<C>()
代わりにへの呼び出しを変更するとref_C_factory<C>()
、「一時的な参照を返す」という警告がいくつか表示されますが、プログラムはコンパイルされ、代わりにb.doB()
次の行でセグメンテーション違反が発生します (... から何も出力されa.doA()
ません)。
からのバックトレースはgdb
次のようになります - 2行目は、上記のコードの1行です
これらのセグメンテーション違反の原因は何ですか? 私が疑うように、値/参照ケースでのスライス/スコープですか? そうでない場合、それは何ですか? そして最も重要なのは、入力データからインスタンスを構築する良い方法は何ですか?
コードサンプル
以下のコードは、コンパイルして、たとえば GCC 4.8 を使用して上記の動作を提供する必要があります
gcc -g -Wall -std=c++11 -o test test.cpp
(とにかく、それは私がしていることです)。
c++ - タイプがshared_ptrの場合、ローカルウィンドウでローカルを派生タイプとして表示する
派生型に対するを持っているshared_ptr
が、shared_ptr の型が基本型に対するものである場合、Visual Studio の [ローカル] ウィンドウには基本型のメンバーしか表示されません (まるでオブジェクトがスライスされたかのように)。
以下は、私が見ている問題を示す非常に小さなプログラムです。が作成された後にブレークポイントが設定され、変数が [ローカル] ウィンドウに表示されてshared_ptr
いる場合、変数は表示されません。sp
dvalue
これを見る方法はありますか?マネージ コードに甘やかされてしまったのかもしれません...
c++ - スライスが正確に発生するのはなぜですか?
次のように、スーパークラスをサブクラスに割り当てると、オブジェクトの追加のサブクラス固有の部分が切り落とされることを理解しています。
もしそうなら:
しかし、参照が機能する理由とオブジェクトが機能しない理由がわかりません。
その理由は、参照なしでオブジェクトをコピーする必要があるためだと見てきましたが、なぜこれがスライスにつながるのかまだわかりませんか?
また、参照が機能する理由もわかりません。Sub オブジェクトの先頭へのスーパー参照をポイントしていますが、コンパイラはスーパー オブジェクトの大きさを認識しているため、スーパー パーツ (オブジェクトのサブ クラス コンポーネントに対応) を超えてメモリを関連付けることは期待できません。スーパーリファレンスに?
c++ - オブジェクトのスライスを回避する C++
オブジェクトをコピーしたいが、スライスは避けたいという問題があります。
これを回避する方法はありますか?元のオブジェクトが必要になる前にスコープを離れてしまうため、コピーを作成する必要があります。
c++ - インスタンスメソッドや変数を追加しないオブジェクトのスライス
次のような状況では、オブジェクトのスライスを無視できないのではないかと考えていました。
オブジェクトのスライスについて私が考えたことによると、特定のコピー/移動コンストラクター/代入演算子が失われたとしても、ここで失うものは何もないので、コンストラクターの呼び出しといくつかのデータの設定に制限されてDerived
いると仮定すると、安全な操作になる可能性があります。しかし、これは私が見落としている典型的な落とし穴かもしれません。Derived
Base
それについて保証された動作はありますか?
c++ - 私が間違っているC ++でスライスしますか?
C++ のスライシングの問題について読み、いくつかの例を試しました (私は Java のバックグラウンドを持っています)。残念ながら、私はいくつかの動作を理解していません。現在、私はこの例 (Efficent C++ Third Edition の別の例) に行き詰まっています。誰かがそれを理解するのを手伝ってくれますか?
親の私の単純なクラス:
子の私の単純なクラス:
メイン:
実行後、次のようになります。
名前: 親
名前: 親
おまけ:子増し紐
キャスト後の名前:親
それが「スライス」の原因であるため、最初の2行は理解しています。しかし、静的キャストを介して子を親にキャストできる理由がわかりません。本には、スライスした後、すべての専門的な情報がスライスされると書かれています。したがって、情報がないため、 pをcにキャストできないと思います(関数 printNames の先頭で、追加情報なしで新しい Parent オブジェクトが作成されます)。
さらに、「キャスト後の名前: 子」ではなく、キャストが成功した場合に「キャスト後の名前: 親」が表示されるのはなぜですか?