1. ホーム
  2. c++

[解決済み] C++の静的コンストラクタ?プライベートな静的オブジェクトを初期化する必要があります

2022-04-20 12:55:53

質問

プライベートな静的データ・メンバ(a-zのすべての文字を含むベクトル)を持つクラスを作りたいのです。javaまたはC#では、クラスのインスタンスを作成する前に実行される"staticコンストラクタ"を作成し、クラスの静的データ・メンバーをセットアップすることだけが可能です。このコンストラクタは一度だけ実行され(変数は読み取り専用なので一度だけ設定すればよい)、クラスの関数であるため、クラスのプライベートなメンバにアクセスすることができます。コンストラクタに、ベクトルが初期化されているかどうかをチェックし、初期化されていない場合は初期化するコードを追加することもできますが、多くのチェックが必要になり、この問題の最適解とは思えません。

変数は読み取り専用なので、public static const にして、クラスの外で一度設定すればいいという考えもありますが、もう一度言いますが、醜いハックのような気がします。

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

どのように解決するのですか?

静的コンストラクタと同等の機能を得るには、静的データを保持するための普通のクラスを別に書き、その普通のクラスの静的インスタンスを作る必要があります。

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

};