Инициализация статического массива констант в заголовочном файле - PullRequest
36 голосов
/ 22 января 2010

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

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

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

Ответы [ 4 ]

49 голосов
/ 22 января 2010

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

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

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

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

29 голосов
/ 12 апреля 2013

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

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

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

  • Нет необходимости в файле cpp
  • Вы можете сделать проверку диапазона, если хотите
  • Вам не нужно беспокоиться о фиаско статической инициализации
20 голосов
/ 22 января 2010
//Header File 
class test 
{ 
    const static char array[];
}; 

// .cpp
const char test::array[] = { '1', '2', '3' }; 
6 голосов
/ 04 декабря 2016

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

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

...