1. ホーム
  2. c++

C++の静的初期化順序

2023-10-24 10:20:41

質問

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