問題タブ [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.
java - 静的フィールドの前に初期化された非静的フィールド
注:質問として投稿するつもりでしたが、SSCCE で問題を再現しようとした結果、以下に投稿された解決策にたどり着きました。
コードにクラスがあり、フィールドの前private
に非static
フィールドが初期化されています。次の SSCCE では問題を再現できませんでした。static
final
何らかの理由で、File myDefaultPath
が の前に初期化されていませんJFileChooser myFileChooser
。
static
(特にstatic final
) フィールドを最初に初期化すべきではありませんか?
c++ - C++ 標準:「順序」が定義されているものと定義されていないものがあるのはなぜですか?
- クラスを持つと、そのメンバーの初期化順序はコンストラクターで強く定義されます (この質問のように、メンバー間の依存関係を許可するためかもしれませんが、これは設計上の問題だと思います。循環依存関係を想像できます)。
- 関数呼び出しがあり、パラメーター評価の順序が定義されていません。C 互換性のためだと思います。
そして、次の「恐ろしいダイヤモンド」問題のエラーがあります。
コンパイラは、選択するバージョンを認識していません。順序があいまいであると定義されています。この質問で定義されているように(説得力のない答えで)「左から右の深さ優先解決順序」を使用しない、つまりCよりもBを選択しないのはなぜですか?
では、なぜこれらの異なるアプローチが必要なのでしょうか? 3 ではなく 1 に厳密な順序があるのはなぜですか? 1 を未定義のままにしておく方が簡単ではありませんか? それとも 2 は単純に左から右に定義されていますか?
c++ - 基本クラスの初期化中に取得した情報を派生クラスに格納するにはどうすればよいですか?
基本クラスを初期化するためのデータを考え出すことの副作用として、派生クラスが、後でそのインターフェイスを介して利用できるようにする必要がある情報を計算するという状況があります。以下は、必要な情報としてブール値を使用して、問題のアイデアを示しています。
これに関する問題は、派生クラスの独自のデータ メンバーが初期化される前に、基底クラスの初期化中に重要な情報が計算されることです。したがって、派生クラスのデータ要素にはまだ書き込んではいけません。過去 20 年間に遭遇したどのプラットフォームでも、まだ正式に作成されていないブール値を使用できると確信していますが、未定義の動作を呼び出すことは避けたいと思います。
問題の情報は基本クラスとはまったく関係がないため、基本クラスに格納することはできません。また、情報を静的データ メンバーに格納することはできません。これを実行できるようにコードをリファクタリングする方法についていくつかのアイデアがありますが、思いついたものはすべて、このような小さな問題には非常に邪魔に思えます。それで、あなたの誰かが何か簡単なことを思いつくことができるのだろうか?
注: 組み込みプラットフォームを使用しているため、GCC 4.1.2 に固執しています。厳密には C++03 (TR1 を含む) ですが、C++11 はありません。
delphi - モジュールの登録に初期化セクションを使用するのは良い考えですか?
分散型モジュール登録の良い解決策を探しています。
プロジェクトのすべてのモジュール ユニットを使用する単一のユニットは必要ありませんが、モジュール ユニット自体を登録できるようにしたいと考えています。
initialization
私が考えることができる唯一の解決策は、Delphi ユニットに依存することです。
私はテストプロジェクトを書きました:
ユニット2
ユニット3
4号機
ただし、これには 1 つの欠点があります。登録単位 (この場合はUnit2
s)initialization
セクションが常に最初に実行されることが保証されていますか?
セクションに関する警告をよく読んでいますが、initialization
セクションで例外を発生させないようにする必要があることを知っています。
c++ - クラス階層における静的な初期化順序
私は最近、 Static Initialization Order Fiascoを痛感しました。「初期化順序は翻訳単位全体で定義されていません」というルールが、子クラスの静的メンバーに必要な親クラスの静的メンバーにも適用されるかどうか疑問に思っています。
たとえば、(簡潔にするために、すべての # ガードとインクルードを除く)があるとします
そして、のサブクラスA
、
ここには2つの翻訳単位があり、一方は静的オブジェクトに依存し、他方は初期化時に静的オブジェクトに依存しています...静的初期化順序の大失敗のインスタンスのようです。
私の質問は:それは実際に安全ですか?
つまり、後者が初期化される前にB::id
コピーされたジャンクが含まれる可能性がないことを保証できますか? A::count
私自身のテストでは、A
常に最初に初期化されるように見えますが、初期化の順序でノイズを導入して、動作が未定義の場合に失敗する可能性を高める方法がわかりません。
c++ - クラスのプライベート メソッドへのポインタを使用する名前付きパラメータ イディオム
おそらく実際には「従来型」ではないことをしているときに、C++ コンパイル エラーが発生しました。簡単にするために、使用しようとしているメカニズムを読みやすい方法で書き直し、同じ問題が発生することを確認しました。
まず、コードは次のとおりです。
test.h // - - C++ - -
test.cpp // - - C++ - -
ここにエラーがあります:
したがって、これが私が望むものを達成するための最良の方法であるかどうかはわかりません (おそらくそうではありませんが、他の提案があれば大歓迎です)。しかし、私の目標は、それを機能させるか、なぜ機能しないのかを正確に理解することです。そこから何かを学べるように!
基本的な考え方は次のとおりです。
- クラス「item」は、「init().has_funcPtr(&function_name)」のようにコンストラクターに連結されたクラス「init」のメソッド「has_funcPtr」を使用して、名前付きパラメーターイディオムで初期化できます。
- クラス "user" は、そのプライベート メソッド "func1" へのポインタを、型 "item" のプライベート メンバのプライベート メンバとして格納できます。
このようにして、オブジェクト「項目」の特定のメソッドが呼び出されたとき (簡単にするために、この長い部分はエラーとは関係がないため、ここには含めませんが、このコード スニペットの目的を説明するだけです)そのメソッドは、関数へのポインターを介して、何かを実行し、その親オブジェクト「ユーザー」のプライベートメソッドを呼び出すことができます(これが十分に明確であることを願っています...)。
現在、オブジェクトの初期化の順序に問題があると思いますが、どこでどのように修正すればよいかわかりません。特に、「func1」メソッドはクラス「user」のどのメンバーでも動作しないため、その参照を初期化リストで直接使用して「init」オブジェクトを初期化し、それを「item」にフィードできると考えました" 物体。
よろしくお願いします
java - ネストされた Enum がそのコンストラクターで親の静的メンバーを参照すると、NPE が発生するのはなぜですか?
再作成する条件 (私が知る限り):
- ネストされた列挙型は、親の静的メンバーを参照します
- ネストされたクラス
- 親クラスの静的メンバーは、ネストされたクラスへのコンストラクター引数として enum を取ります
- 列挙型は、親クラスの他の何よりも前に外部クラスによって参照されます
このコードをオンラインで実行します: https://repl.it/repls/PlushWorthlessNetworking