静的コンストラクターと同様に、静的データ メンバーを初期化するにはどうすればよいですか? [重複] 質問する

静的コンストラクターと同様に、静的データ メンバーを初期化するにはどうすればよいですか? [重複] 質問する

プライベートな静的データ メンバーを持つクラスを作成したい:

class C {
    // read-only, can also be static const
    // should be filled with all characters from 'a' to 'z'
    static std::vector<char> alphabet;
public:
    C() { /* ... */ }
};

Java または C# では、クラスのインスタンスを作成する前に実行される「静的コンストラクター」を作成し、クラスの静的データ メンバーを設定することができます。これは 1 回だけ実行され (変数は読み取り専用であり、1 回だけ設定する必要があるため)、クラスの関数であるため、プライベート メンバーにアクセスできます。

コンストラクターに、ベクターが初期化されているかどうかを確認し、初期化されていない場合は初期化するコードを追加することもできますC()が、これには多くの必要なチェックが導入され、問題に対する最適な解決策とは思えません。

メンバーは読み取り専用なので、static constクラスの外部で定義することもできますが、それは醜いハックのように思えます。

インスタンス コンストラクターで初期化したくない場合、クラス内にプライベート静的データ メンバーを持つことは可能ですか?

ベストアンサー1

静的コンストラクターと同等のものを取得するには、静的データを保持する別の通常のクラスを記述し、その通常のクラスの静的インスタンスを作成する必要があります。

class StaticStuff
{
     std::vector<char> letters_;

public:
     StaticStuff()
     {
         for (char c = 'a'; c <= 'z'; c++)
             letters_.push_back(c);
     }

     // provide some way to get at letters_
};

class Elsewhere
{
    static StaticStuff staticStuff; // constructor runs once, single instance

};

おすすめ記事