web-dev-qa-db-ja.com

ヘッダーファイルの定数静的配列の初期化

次のことが無効であることがわかりました。

//Header File
class test
{
    const static char array[] = { '1', '2', '3' };
};

これを初期化するのに最適な場所はどこですか?

36
user174084

最適な場所はソースファイルです

// Header file
class test
{
    const static char array[];
};

// Source file
const char test::array[] = {'1','2','3'};

クラス宣言で、しようとしたように整数型を初期化できます。他のすべての型は、クラス宣言の外側で一度だけ初期化する必要があります。

49
Mike Seymour

いつでも次のことができます。

class test {
  static const char array(int index) {
    static const char a[] = {'1','2','3'};
    return a[index];
  } 
};

このパラダイムについてのいくつかの素晴らしいこと:

  • Cppファイルは必要ありません
  • 必要に応じて範囲チェックを行うことができます
  • 静的初期化の失敗 について心配する必要がなくなります
30
JKD
//Header File 
class test 
{ 
    const static char array[];
}; 

// .cpp
const char test::array[] = { '1', '2', '3' }; 
20
peterchen

これで、C++ 17では、インライン変数を使用できます

インライン変数はどのように機能しますか?

単純な静的データメンバー( N4424 ):

struct WithStaticDataMember {
  // This is a definition, no out­of­line definition is required.
  static inline constexpr const char *kFoo = "foo bar";
};

あなたの例では:

//Header File
class test
{
    inline constexpr static char array[] = { '1', '2', '3' };
};

うまくいくはず

6
lz96