1. ホーム
  2. c++

[解決済み] C++で静的プライベートメンバを初期化する方法は?

2022-03-17 11:05:09

質問

C++でプライベートな静的データ・メンバを初期化する最も良い方法は何でしょうか? ヘッダーファイルで試したのですが、変なリンカーエラーが出ます。

class foo
{
    private:
        static int i;
};

int foo::i = 0;

これは、クラスの外からプライベートメンバを初期化できないからだと思うのですが。 では、どうすればいいのでしょうか?

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

クラス宣言は、ヘッダファイル(共有でない場合はソースファイル)に記述する必要があります。
ファイル名:foo.h

class foo
{
    private:
        static int i;
};

しかし、初期化はソースファイルに行う必要があります。
ファイル名:foo.cpp

int foo::i = 0;

もし、初期化がヘッダーファイルで行われた場合、ヘッダーファイルを含む各ファイルには、そのスタティックメンバの定義が含まれることになります。そのため、リンクの段階で、変数を初期化するコードが複数のソースファイルに定義されることになり、リンカエラーが発生します。 の初期化は static int i は関数の外側で行う必要があります。

注意 Matt Curtis: C++では、静的メンバ変数がconst int型である場合、上記の簡略化が可能であると指摘している(例. int , bool , char ). そして、ヘッダーファイルのクラス宣言の中で直接メンバ変数を宣言し、初期化することができます。

class foo
{
    private:
        static int const i = 42;
};