ヘッダーファイル内のプライベート静的データメンバーを初期化する方法 質問する

ヘッダーファイル内のプライベート静的データメンバーを初期化する方法 質問する

C++ でプライベートな静的データ メンバーを初期化する最適な方法は何ですか? ヘッダー ファイルでこれを試しましたが、奇妙なリンカー エラーが発生します。

class foo
{
    private:
        static int i;
};

int foo::i = 0;

これは、クラスの外部からプライベート メンバーを初期化できないためだと思います。では、これを行う最善の方法は何でしょうか?

ベストアンサー1

クラス宣言は、ヘッダー ファイル内、またはクラスが他のファイルで使用されていない場合はソース ファイル内に置く必要があります。

// foo.h
class foo
{
    private:
        static int i;
};

ただし、初期化はソース ファイルで行う必要があります。

// foo.cpp
int foo::i = 0;

初期化がヘッダー ファイル内にある場合、ヘッダー ファイルをインクルードする各ファイルには静的メンバーの定義が含まれます。したがって、リンク フェーズでは、変数を初期化するコードが複数のソース ファイルで定義されるため、リンカー エラーが発生します。初期化はstatic int i関数の外部で行う必要があります。

注: Matt Curtis: C++では、静的データメンバーがconst 整数型( bool、、[C++20 以降]、、、、、、、、、または実装char定義の拡張整数型 (符号付き、符号なし、および cv 修飾されたバリアントを含む) 。次に、ヘッダーファイルのクラス宣言内でデータ メンバーをchar8_tchar16_tchar32_twchar_tshortintlonglong long直接宣言して初期化できます。

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

おすすめ記事