問題タブ [initialization-order]

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 投票する
2 に答える
604 参照

c++ - 静的初期化時に無料の「char const*」を使用する

フリー オブジェクトの初期化順序は、C++ では定義されていません。しかし、次の場合はどうでしょうか。

これはまだ定義されていない動作ですか、それとも文字列リテラルで初期化されたポインターのための特別な規定がありますか?

それはさておき: str が "char const[]" 型だったら? それが std::string だったら?

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

c++ - C++ 静的初期化順序

C++ で静的変数を使用する場合、ある変数を初期化して別の変数をそのコンストラクターに渡したいと思うことがよくあります。つまり、相互に依存する静的インスタンスを作成したいと考えています。

単一の .cpp または .h ファイル内では、これは問題ではありません。インスタンスは、宣言された順序で作成されます。ただし、静的インスタンスを別のコンパイル単位のインスタンスで初期化したい場合、順序を指定することは不可能のようです。その結果、天候によっては、別のインスタンスに依存するインスタンスが構築され、その後でのみ別のインスタンスが構築されることがあります。その結果、最初のインスタンスが正しく初期化されません。

静的オブジェクトが正しい順序で作成されるようにする方法を知っている人はいますか? 私は長い間解決策を探し、それらすべて (Schwarz Counter ソリューションを含む) を試してきましたが、本当に機能するものがあるとは思えません。

1 つの可能性は、静的関数メンバーを使用したトリックです。

確かに、これは機能します。残念ながら、globalObject.MemberFunction() の代わりに globalObject().MemberFunction() を記述する必要があるため、クライアント コードがやや混乱し、洗練されていません。

更新:ご反応ありがとうございます。残念ながら、私は自分の質問に答えたようです。私はそれと一緒に暮らすことを学ばなければならないと思います...

0 投票する
5 に答える
9321 参照

c++ - C ++:構築と初期化の順序が保証されます

C++での構築と初期化の順序の保証について疑問があります。たとえば、次のコードには4つのクラス、、、XおよびがありYます。main関数は、のオブジェクトを含む、のオブジェクトをインスタンス化し、から派生するため、両方のコンストラクターが呼び出されます。さらに、 'sコンストラクターに渡されたパラメーターは、暗黙的にのオブジェクトに変換されるため、'sコンストラクターも呼び出す必要があります。ZWclass Xclass Yclass Zconst char*Xclass WW

C ++標準がコピーコンストラクターの呼び出しの順序に与える保証は何ですか?または、同等に、このプログラムは何を印刷できますか?

編集:これは正しいですか?

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

c++ - デストラクタに副作用があり、オブジェクトが別の静的オブジェクトのデストラクタからアクセスされる場合、静的な初期化解除を行う方法は?

C++ FAQ Lite のセクション 10.13 で説明されている、静的初期化の大失敗を回避するための単純でよく知られたパターンがあります。

この標準パターンでは、構築されたオブジェクトが破棄されない (デストラクタに重要な副作用がない場合は問題にならない) か、別の静的オブジェクトのデストラクタから静的オブジェクトに安全にアクセスできないというトレードオフがあります。 ( C++ FAQ Lite のセクション 10.14 を参照してください)。

私の質問は次のとおりです。静的オブジェクトのデストラクタに最終的に発生する必要がある重要な副作用があり、静的オブジェクトに別の静的オブジェクトのデストラクタからアクセスする必要がある場合、静的初期化解除の大失敗をどのように回避しますか?


(注: FAQ-lite は、この質問はC++ FAQs: FAQ 16.17 で回答されていると言及しています: M. Cline および G. Lomow によるよくある質問です。私はこの本にアクセスできないため、代わりにこの質問をします。 )

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

c++ - この自己初期化は有効ですか?

以前に考えたこの質問がありますが、答えるのは簡単ではないと考えました

私の質問は、プログラムの動作が定義されているか、それがまったく有効である場合に未定義であるかということです。定義されている場合、 の値はx既知mainですか?

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

vb.net - VB.NETのクラスフィールドの初期化順序は、他のフィールドへの参照の影響を受けますか?

このサンプルコードを見てください:

の出力New Bar()は次のとおりです。

フィールドはソースコードに表示されるのと同じ順序で初期化されているようです。これは、(a)予期しない結果につながり、(b)の初期化されていない変数からの読み取りが通常許可されていないことを考えると、少し不可解に思えます。 NET、それでもそれは上でうまく機能しているようです。

VB.NETは、最初に参照フィールドを初期化し、次にそれを参照するフィールドを初期化するのに十分スマートであると期待していました。つまり、代わりにこの出力を見たかったのです。

クラス内の宣言順序dependentを単純に入れ替えることなく、代わりにVB.NETをそのように動作させる方法を誰かが知っていますか?independentBar

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

c++ - 初期化順序の問題

コードサンプルを考えると:

クラスCにはabへの参照があるため、それを使用して初期化する必要があります。クラスAには、BのインスタンスとCのインスタンスが含まれています。

私の質問は次のとおりです。AのCインスタンスをAのBインスタンスで初期化できますか(コンストラクターをわざわざ入れたと仮定して)?次に、AのBの明示的な初期化を実行する必要がありますか、それともクラス内のクラスタイプであるため、デフォルトで初期化されますか?

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

wpf - 初期化順序の制御Fiasco

次のコードを検討してください。

Sliderは、初期化中ValueChangedイベントを発生させます。counternull

これは、私がWPFを使用して遭遇した、より大きな問題の例です。UIイベントはいつでも発生する可能性があり、初期化コードを配置できる場所が1つもないため、すべての後で実行されることが保証されます。 WPFシステムが所有するポインターは初期化されていますが、UIイベントが発生する前です。

これに対処するための最もエレガントな方法は何ですか?この特定の例でデータバインディングを使用する必要があるという事実は、重要ではありません。

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

c# - 静的変数の初期化順序のあいまいさ

C#でシングルトンを構築するための最良の方法を調査しているときに、C++で簡単に言及されている次の記事に出くわしました。

「C++仕様では、静的変数の初期化順序にあいまいさが残っています。」

私は結局質問を調べて、これこれを見つけました。基本的に(私が理解している限り)重要なのは、C++での静的変数の初期化順序が未定義であるということです。さて、これまでのところとても良いと思いますが、その後、記事が後で行う次のステートメントを理解したいと思いました

「幸いなことに、.NET Frameworkは、変数の初期化を処理することで、このあいまいさを解決しています。」

だから私は彼らが言うこのページを見つけました

クラスの静的フィールド変数初期化子は、クラス宣言に表示されるテキストの順序で実行される一連の割り当てに対応します。

の例を挙げてください

「静的コンストラクターの実行時のルール(セクション10.11で定義)では、Bの静的コンストラクター(したがってBの静的フィールド初期化子)は、Aの静的コンストラクターとフィールド初期化子の前に実行する必要があると規定されているためです。」

しかし、私が混乱しているのは、これらの例の静的変数の初期化順序は、クラス内のメソッドまたはフィールドが最初に呼び出されたとき、つまりコードブロックの実行順序に基づいているということです。 (この場合は左から右)。IE:クラス宣言の場所(または順序)に完全に依存しません。しかし、その記事の私の解釈によれば、それはそれらのクラスの宣言の順序の結果であると言っていますが、私のテストはバックアップしていませんか?

誰かが私のためにこれ(そして記事が作ろうとしているポイント)を明確にして、おそらく記述された振る舞いを非識字にするより良い例を提供してくれませんか?

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

scala - オブジェクトの相互参照と初期化順序

次のコードがあります。

最初に、各オブジェクトには初期化するものがいくつかあるため、私は呼び出します

そして、プログラムのある時点csで、オブジェクトのパラメーターを使用するとNullPointerException、 で参照されているオブジェクトの 1 つSeqが実際にあるためnull(コンソールに出力すると、それが示されます) が得られます。つまり、それらを参照する他のオブジェクトinitよりも後で呼び出されるオブジェクトへの参照initは、 に設定される傾向がありますnull

これは興味深い状況です。ここには任意の任意の相互参照があると思われますが、外部メソッドに完全に持ち出さずに初期化を適切に実現する方法がわかりません(カプセル化の内訳です)。SuperClass特に、クラスを拡張する独自のシングルトンを作成する機能がユーザーに与えられる場合があります。

できるだけ少ないボイラープレートでこれを行う最良の方法はどれですか?