問題タブ [member-initialization]

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.

0 投票する
3 に答える
525 参照

c++ - メンバー初期化部分の複雑なステートメント?

私はこれを持っています:

valuesとの値に応じて、異なるファンクターでメンバーを初期化する必要がparam1ありparam2ます。残念ながら、どのファンクターを使用するかを決定するロジックはそれほど単純ではなく、一度values作成すると、関連する比較ファンクターを変更することはできません。

?:だから...メンバーの初期化部分にすべての決定ロジックを配置する必要がありますが、演算子を使用する方法がわかりません。
そこにもっと複雑なステートメントを入れることは可能ですか?? (switch文のように)

そうでない場合、コンストラクターの本体で初期化できるように、の構築を遅らせる方法はありvaluesますか??

ありがとう。

0 投票する
6 に答える
12354 参照

c++ - C++メンバー変数を条件付きで初期化する正しい方法は?

これは本当に簡単な質問だと思います。次のコードは、私がやろうとしていることを示しています。

m_classこれは、空のコンストラクター (存在しない) で作成されているため、コンパイルされません。これを行う正しい方法は何ですか?私の推測では、ポインターを使用して を使用してインスタンス化m_classしていますnewが、もっと簡単な方法があることを願っています。

編集:前に言ったはずですが、実際の問題にはさらに複雑な問題があります。環境をセットアップするために、m_class を初期化する前にメソッドを呼び出す必要があります。そう:

ファンシーな初期化リストのトリックでこれを達成することは可能ですか?

0 投票する
4 に答える
207 参照

c++ - CS2512の正しい控え方

次の問題で私を助けてください:

私は次のクラスを持っています:

実装は明らかです。コードの重複を最小限に抑えるために、Init メソッドを使用して CombinationRule を初期化するつもりでした。残念ながら、各コンストラクターで「メンバー初期化リスト」を使用しないと、コンパイラーは「エラー C2512: 'ChemicalElement': 適切なデフォルト コンストラクターがありません」というエラーを出します。デフォルトのコンストラクターまたはメンバー初期化リストを使用する代わりに、このエラーを解決するエレガントな方法はありますか? ところで: クラス定義に他の問題がある場合は、それも追加してください。私は C++ を再検討しているので、それらに注意したいと思います。

0 投票する
8 に答える
121577 参照

c++ - 明示的に行わない場合、C++ クラス メンバーはどのように初期化されますか?

ptrnamepnamernamecrnameおよびのプライベート メンバを持つクラスがあるとしageます。自分で初期化しないとどうなりますか? 次に例を示します。

そして、私は:

メンバーはexでどのように初期化されますか? ポインターはどうなりますか? デフォルトのコンストラクターと?stringで0 で初期化されます。参考メンバーは?また、const参照はどうですか?intstring()int()

より良い(バグのない)プログラムを書くことができるように、それを学びたいです。どんなフィードバックでも役に立ちます!

0 投票する
1 に答える
511 参照

c++ - メンバーの初期化:GCCのバグまたは私の考え?

クラスのプライベートセクションで列挙型が定義されています。このタイプのメンバーも定義されています。コンストラクター本体でこのメンバーを初期化しようとすると、実行時にメモリ破損の問題が発生します。代わりに、同じコンストラクターの初期化リストを使用して初期化すると、メモリ破損の問題は発生しません。私は何か間違ったことをしていますか?

コードを単純化し、それがGCCのバグである場合は、結合/継承などの特定のクラスの組み合わせであると確信していますが、これが問題の本質を捉えていることを約束します。初期化される前にこのメンバー変数を使用するものはなく、完全に構築されるまで、新しく作成されたオブジェクトを使用するものはありません。このメンバーの初期化は確かに私が本体で最初に行うことであり、メモリの破損が発生すると、valgrindはそれが変数を初期化する行にあると言います。Valgrindは、サイズ4の無効な書き込みであると述べています。

関連するヘッダーコード:

関連する.cppコード(メモリの破損とクラッシュを引き起こします):

関連する.cppコード(メモリの破損やクラッシュを引き起こしません):

編集:これを引き起こした原因については、私の「答え」を参照してください。それを読んだ後、なぜそれが違いを生んだのか誰かが私に説明できますか?ヘッダーの何も変更しませんでした。オブジェクトファイルを挿入したときに印刷ステートメントが表示され、一方のビルドではバグが表示されなかったため、オブジェクトファイルが再構築されていました。

良い説明のために、私はそれをこの質問への答えとしてマークします。

0 投票する
2 に答える
4557 参照

c++ - メンバーごとの初期化

重複の可能性:
C++ 初期化リスト

クラスでのメンバーごとの初期化と直接の初期化の違いは何ですか? クラスで定義されている 2 つのコンストラクターの違いは何ですか?

0 投票する
1 に答える
528 参照

c++11 - コンストラクターを使用しない C++0x メンバーの初期化

N3257で、コンストラクターなしでメンバーを初期化する例を見つけました。これは問題ありません。PODなので可能だと思います。

この例で遊んだとき、生のポインタが好きではないので、*をに置き換えました。&

これは問題なく、GCC-4.7.0 で警告なしにコンパイルされました。

次に、POD の初期化と、C++0x で何が変更されたのかに興味を持ちました。そこで Bjarnes FAQを見つけました。彼はそこで、POD にはポインタが含まれる場合がありますが、参照は含まれないと述べています。

Ops、今私は疑問に思います:

  • とにかく、コンパイラーがコンストラクターなしで初期化できる非PODオブジェクトがここにありますか?ここで使用されているメカニズムを見逃していますか?
  • または、GCC-4.7.0 は、この方法で参照を初期化することによって非標準の動作をしていますか?
  • または、POD での参照も許可する Bjarnes FAQ 以来、std に変更がありましたか?

更新:現在の std ( 8.5.1 Aggregates [dcl.init.aggr] ) で集計が見つかりましたが、そこには参照が記載されていないため、それらがこれにどのように関連しているかはわかりません

0 投票する
2 に答える
477 参照

java - Java インスタンス メンバーの初期化で例外がスローされる

次のクラスがあるとしましょう

B のインスタンスを作成するためのファクトリがありますが、作成者メソッドは例外をスローします。

宣言行に Ab を設定すると、例外を処理する方法がありません

コンストラクター内で Ab を設定すると、「半分焼かれた」インスタンスが作成されるか、再び例外がスローされ、呼び出し元のコードが適切に初期化されていないインスタンスを処理するように強制されます。

また

B のインスタンスを遅延初期化することができます。

しかし、スレッドセーフにする唯一の方法は、Java の JVM 内で壊れていることが知られているDouble-Checked Lockingを使用することです。

では、辛抱強い読者の皆さん、私は何をすべきでしょうか?

言い換えれば、作成時に例外をスローする可能性のあるオブジェクトへの参照を含むオブジェクト インスタンスを初期化するための最良の解決策は何ですか?

0 投票する
2 に答える
1153 参照

c++ - 初期化リストの前にチェックを実行する

コンストラクターが複数のパラメーターを取る自分のクラスにクラス A のメンバーがあります。自分のクラスのパラメーターをクラス A のコンストラクターに転送しています。しかし、これらのパラメーターが正しいことが重要なので、A のメンバーを構築する前に確認する必要があります。問題は次のとおりです。メンバーのメンバーを除外できます初期化リスト、デフォルトのコンストラクターを効果的に呼び出します。コンストラクターでのチェックの後、代入で A のコンストラクターを呼び出すことができます。ただし、 A のデストラクタがプライベートであるため、これはエラーを生成します。

どうすればこれを解決できますか?

0 投票する
1 に答える
972 参照

c++ - Clang ++非静的データメンバーの初期化エラー? C++11

Clang が何を言っているのか、または G++-4.7 が正常にコンパイルしているように見えるので、それが正しいかどうかを理解できないようです。

このエラーはstd::uniform_int_distribution、非静的メンバーの中括弧で初期化しようとしたことが原因です。

以下は失敗します (token_countはテンプレート パラメーターです)。 std::uniform_int_distribution<Int> random_dist{0, token_count-1};

エラーで:

ただし、次のようにして初期化できます。

std::uniform_int_distribution<Int> random_dist = std::uniform_int_distribution<Int>(0, token_count - 1);

次のコマンドを使用してコンパイルしています: clang++ -std=c++11 -stdlib=libc++ -lc++abiwith Clang-3.2.

の出力clang -v: