Инициализация постоянного статического массива в файле заголовка

Я только что узнал, что следующее недопустимо.

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

Где лучше всего инициализировать это?

Ответы

Ответ 1

Лучшее место в исходном файле

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

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

Вы можете инициализировать целые типы в объявлении класса, как вы пытались сделать; все остальные типы должны быть инициализированы вне объявления класса и только один раз.

Ответ 2

Вы всегда можете сделать следующее:

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

Пара приятных вещей об этой парадигме:

Ответ 3

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

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

Ответ 4

Теперь, в С++ 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' };
};

должен просто работать