C++の静的初期化順序
質問
C++で静的変数を使用するとき、ある変数を初期化して、そのコンストラクタに別の変数を渡したいということがよくあります。言い換えれば、私はお互いに依存する静的インスタンスを作成したいのです。
単一の .cpp または .h ファイル内では、これは問題ではありません:インスタンスは、それらが宣言された順序で作成されます。しかし、別のコンパイル単位のインスタンスで静的インスタンスを初期化したい場合、その順序を指定することは不可能に思えます。その結果、天候によっては、他のインスタンスに依存するインスタンスが構築され、その後に他のインスタンスが構築されるということが起こり得る。その結果、最初のインスタンスが誤って初期化されることになります。
静的オブジェクトが正しい順序で作成されることを保証する方法を知っている人はいますか?私は長い間解決策を探し、すべてのもの (Schwarz Counter の解決策を含む) を試しましたが、本当に機能するものがあるのか疑い始めています。
1 つの可能性は、静的関数メンバを使ったトリックです。
Type& globalObject()
{
static Type theOneAndOnlyInstance;
return theOneAndOnlyInstance;
}
確かに、これは動作します。惜しむらくは、globalObject.MemberFunction() の代わりに globalObject().MemberFunction() を書かなければならず、結果としてやや混乱した、エレガントではないクライアントコードになることです。
更新しました。 反応をありがとうございます。遺憾ながら、確かに私は自分自身の質問に答えてしまったようです。私はそれに耐えることを学ばなければならないと思います...。
どのように解決するのですか?
あなたは自分自身の質問に答えました。静的初期化の順序は不定であり、それを回避する最もエレガントな方法は(静的初期化を行う一方で、つまりそれを完全にリファクタリングしない)、初期化を関数でラップすることです。
から始まる C++ FAQ の項目を読んでください。 https://isocpp.org/wiki/faq/ctors#static-init-order
関連
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】'cout'は型名ではない
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】C++におけるstaticキーワードとその様々な使用法
-
[解決済み] メンバ関数内の静的変数
-
[解決済み] C++の静的コンストラクタ?プライベートな静的オブジェクトを初期化する必要があります
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】C++11でローカル静的変数の初期化はスレッドセーフか?重複
-
[解決済み] c++で、関数名の前のチルダ"~"は何を意味するのですか?