問題タブ [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++ - 継承されたオブジェクトのスライス
次のケースでは、スライスの問題が指摘されてい ます。
関数呼び出し中: オブジェクトのスライスとは?
私の質問は、代入演算子とコピー コンストラクターが仮想として宣言され、派生クラスが必要なデータを適切にコピーする場合、これらのケースの両方が解決されないでしょうか? もしそうなら、原則として値渡しはこれらの場合でも機能するはずですよね?
c++ - サブクラスオブジェクトを動的に格納するためのタイプスーパークラスのC ++での配列の作成
次のコードを検討してください。
ご覧のとおり、親クラスへの参照の動的に割り当てられたストレージを作成したいのですが、それぞれが子クラスを指すことができますが、その配列から子クラスを再度抽出する方法がわからないため、その配列にアクセスできます変数 b;
次のアプローチを試しましたが、うまくいきませんでした。「'superclass*' から非スカラー型 'subclass' への変換が要求されました」および「'superclass*' から非スカラー型 'subclass2' への変換」というエラーが表示されます。要求された」
私は小さな何かが欠けていると確信しています。
PS: 同様の質問は見つかりませんでしたが、存在する場合はリダイレクトしてください。
c++ - 派生クラス バージョンを実行しない仮想関数
ストリーミングしたい SceneElements のコレクションがあります。これは集約クラスです:
これは基本クラスです:
これは派生クラスの 1 つです。
しかし、このコードを実行すると:
表示されます
実際の要素ではなく、それが想定されていました。
c++ - 派生オブジェクトの明示的なスライス
私は自分の会社のために構築したプロジェクトのクラス構造をいくつか持っています。ある時点で、派生オブジェクトの「通常は望ましくない」スライスが実際に私のコードを効率的にするのを見てきました。観察してください:
ここで、Derived の someTest() が失敗した場合、これは、オブジェクトが実際には Base タイプ (myType = 1) または障害のあるオブジェクト (myType =0) であることを示しています。これらはコンストラクターにあり、例外処理 (組み込みシステム) を使用できないため。私はこれについて考えました:
では、なぜこのようなデザインになったのでしょうか。さて、クラスを設計しているうちに、「Base」(type 1) と「Derived」(type 2) のクラスの内部動作のメソッドが異なるため (さらに、type 3,4,5 の可能性がある..)内部も異なるオブジェクト)、およびすべてのメソッドを作成して「if-then-else」でチェックしたくなかったため。私はそのような設計を行い、異なるメソッドを仮想化して、(ポリモーフィズムのおかげで) 正しく呼び出すことができるようにし、共通のメソッドをいくつかの基本クラスに置くことができると考えました。
しかし今、最初に、その奇妙な構文 ( & static_cast < Base > *deriv ) が正しいかどうかはわかりません (テストされ、機能しているように見えましたが、これが運によるものではないことを確認したいだけです)。第二に、これがこれを達成するための「推奨される方法」であるかどうかはわかりません-この構文がメモリリークなどを引き起こす可能性があると思います...
問題をより明確にするために、コードを少し変更しました (構文も修正しました)。
さて、 &(static_cast(*deriv)) は誤ったアプローチであるため、Base クラスでのチェックをバイパスする「コピー コンストラクター」を作成できるかどうかを考えていました (これが、実際にこれらのものを試す理由です。場合によってはそのテストを実行したくない)。以下のように:
これを書いたので、テストブロックでそれを行うことができると思います:
これはどうですか?
c++ - ライブラリの作成に使用されるヘッダーは、ライブラリを使用するヘッダーと同じである必要がありますか?
ソースを .o ファイルにコンパイルし、"ar rcs libMyLibrarylib.a *.o" を使用してライブラリを作成した後、メンバー変数とプライベート関数がストライプ化されたヘッダー ファイルを使用しているため、segfault が発生します。まったく同じヘッダーを使用すると、エラーは発生しません。マップ内のポインターを削除すると、セグメンテーション違反が発生します。
ライブラリの作成に使用されるヘッダー
コンパイルされたライブラリで使用されるヘッダー
正確なヘッダー ファイルを使用しない場合、スライシングまたは何かがありますか? ライブラリを使用している人からTypeの #include を隠したい。
ライブラリの単体テストがあります。セグメンテーション違反はしませんが、コンパイルに使用したものと同じヘッダー ファイルを使用します。
c++ - C++ オブジェクト ファクトリ関数
次のデータ構造があるとします。
ID、名前、およびカテゴリが関数で認識されている派生クラスのベクトルを返す単一のファクトリ メソッドを作成したいと考えています。私が遭遇する問題はスライスです...
構造体 A のデータ メンバーが失われました。(dynamic_cast を A に戻して、製品コードで受け入れられるようにしますか?)
だから私はこのテンプレートメソッドを持っていますが、それでも最善の解決策だとは思いません:
テンプレート法以外に良い解決策はありますか?
c++ - キューを使用したオブジェクトのスライス
-std = c++0xでEclipse/gccを使用してUbuntuで開発する。
オブジェクトのスライスに問題があるようですが、これはここで見た他の質問には当てはまりません。私は非常に単純な基本クラス/子クラスの継承モデルを持っています。基本クラスには、明らかに子が実装する1つの純粋仮想関数があります。
私が欲しいのは、ワーカースレッドで処理するためにこれらのオブジェクトを格納できるキューを用意することです。ポインタを保存する必要があることはわかっています。そうしないと、スライスが保証されます。したがって、これを行うクラス( "Processor")には、次のものがあります。
次に起こることは、継承/ポリモーフィズムが正しく機能していないかのように、「純粋仮想メソッドが呼び出されました」と言ってプログラムがクラッシュすることです。テストしたときにこれが機能することを確認したので、継承が正しく設定されていることを知っています。
どんな指導も大歓迎です!
c++ - ポインターとオブジェクトのスライス
オブジェクトのスライスについて難しい方法を学んでいます。ポインタがオブジェクトのスライスになる可能性があるかどうか疑問に思っています。言い換えると:
- ポインターがオブジェクト スライスの犠牲になることはありますか? または、ポインターを使用している限り、オブジェクト スライスから常に安全ですか?