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_t
char16_t
char32_t
wchar_t
short
int
long
long long
直接宣言して初期化できます。
class foo
{
private:
static int const i = 42;
};