問題タブ [data-members]
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++ でどのデータ メンバーの初期化をいつ使用するか
このプログラムを考えると:
データ メンバーの初期化の 3 つの形式を見ることができます。
- メンバー初期化子リストの使用
- コンストラクターの使用
- クラス本体での宣言の使用
いつどれを使う?
c++11 - コンストラクタ パラメータ リストでの静的データ メンバの無効な使用
私はこのようなクラスを持っています:
しかし、次のようなコンパイルエラーが発生します。
このエラーを回避するための提案を歓迎します。また、私のコードの間違いを指摘して、私がよりよく理解できるように少し説明してください。前もって感謝します。
c++ - 一時オブジェクトのデータ メンバーと API 設計の有効期間の延長
次のようなクロスプラットフォームPath
クラスがあるとします。
メンバー関数はパスのparent()
親パスを返すthis
ため、(正しく) それを表す新しく構築されたPath
オブジェクトを返します。
OS レベルでパスを UTF-8 文字列として表すプラットフォーム (Unix など) の場合、内部表現はすでにUTF-8であるためas_utf8()
、内部表現への参照を直接返すことが合理的と思われます。path
次のようなコードがある場合:
次の理由により、これらの行はどちらも問題ありません。
my_path
持続すると仮定すると、s
有効なままになります。- によって返される一時オブジェクトの有効期間は、によって
parent()
延長されますconst&
。
ここまでは順調ですね。ただし、次のようなコードがある場合:
が一時オブジェクトを参照するのではなく、そのデータ メンバーを参照するため、によって返される一時オブジェクトの有効期間が延長されないため、これは誤りです。この時点で を使用しようとすると、ガベージまたはコア ダンプが発生します。コードが代わりにあった場合:parent()
const&
s
その場合、コードは正しいでしょう。ただし、このメンバー関数が呼び出されるたびにテンポラリを作成するのは効率的ではありません。また、 「getter」メンバー関数がデータ メンバーへの参照を返してはならないことも意味しています。
as_utf8()
API をそのままにしておくと、呼び出し元が a を返すかどうかを確認するためにの戻り値の型を調べなければならないという過度の負担がかかるように思われます。そうであるconst&
場合、呼び出し元はオブジェクトを使用する必要があります。ではありませんconst&
。オブジェクトを返す場合、呼び出し元はconst&
.
この問題を解決して、ほとんどの場合に API が効率的でありながら、一見無害に見えるコードからダングリング参照をユーザーが取得できないようにする方法はありますか?
ちなみにこれはg++ 5.3でコンパイルしたものです。一時ファイルの有効期間を延長する必要がある可能性がありますが、コンパイラにバグがある可能性があります。
c++ - 複数のクラスとヘッダーを持つシッピング プログラムの継承、プライバシー、およびオブジェクトに関する C++ の質問
私のプログラムは、EndPoint の toString メソッドをソースとする「to」アドレスと「from」アドレスを出力することになっていますが、それを実装する方法がよくわかりません。これが私のコードです。Package::Package コンストラクターで toString メソッドを取得して、EndPoint の toString メソッドの内容を出力するにはどうすればよいですか?
主な方法:
このプロジェクトでは、継承を使用して配送プログラムを作成する必要があります。プライベートで、送信者と受信者の情報を含む「EndPoint」クラスと、すべてをコンパイルして文字列にする「Package」クラスを含める必要があります。
私のエラーは、Package コンストラクターに EndPoint クラスからの情報を含めることができるようにする方法に関するものです。メイン メソッドは Package クラスが必要な場所 (EndPoint、EndPoint、Weight、Cost) でフォーマットされているため、そのようにコンパイルされません。EndPoint 情報を Package オブジェクトに送信する方法がわかりません。
ここに私のエラーがあります:
- コンストラクタのインスタンスなし
"Package::Package" matches the argument list argument types are: (EndPoint, EndPoint, double, double)
Error C2440 'initializing': cannot convert from 'initializer list' to 'Package'
Error C3861 'setprecision': identifier not found
パッケージ.h
パッケージ.cpp
メイン.cpp
残りの部分に飛び込む前に最初の部分を機能させようとしているので、ここでコードのブロックをコメントアウトしました。
編集:
アドバイスありがとうございました!私はいくつかの編集を行い、大量の余分なコード (ゲッターとセッター。私は Java で学んだ...) を取り出し、プログラムをコンパイルして、小さいながらも重要な問題を除いて意図したとおりに動作させました。
c++ - デフォルトの初期化子でラムダを使用する vs メンバー関数を使用する
デフォルトの初期化子で「ワンタイム」ラムダを使用することと、プレーンな古いメンバー関数を使用することに違いはありますか?
対:
私が目にするのは、2 番目のアプローチの欠点だけです。ここでJ
は、 class の名前空間に追加のシンボルが導入されていますA
。別の区別はありますか?