Подтвердить что ты не робот

Создание постоянного массива в С++

Есть ли причина, почему кодовые блоки говорят мне, что я не могу создать массив? Я просто пытаюсь сделать:

const unsigned int ARRAY[10] = {0,1,2,3,4,5,6,7,8,9};

и это дает мне

error: инициализатор, заключенный в фигурные скобки, здесь не разрешен перед '{' токеном

Я изменил другие части инициализатора, но ошибка всегда говорит одно и то же. Это, похоже, не имеет смысла, поскольку это одна из первых вещей, которые я изучил в С++.

4b9b3361

Ответ 1

Вы говорите, что вы сделали это в классе, как частную переменную.

Вспомним, что (на данный момент) переменные-члены не могут быть инициализированы в том же месте, где вы объявляете их (за некоторыми исключениями).

struct T {
   std::string str = "lol";
};

не работает. Это должно быть:

struct T {
   std::string str;
   T() : str("lol") {}
};

Но, чтобы добавить оскорбление к травме, pre-С++ 0x, вы не можете инициализировать массивы в ctor-initializer!:

struct T {
   const unsigned int array[10];
   T() : array({0,1,2,3,4,5,6,7,8,9}) {} // not possible :(
};

И поскольку ваши элементы массива const, вы не можете полагаться на присваивание:

struct T {
   const unsigned int array[10];
   T() {
       for (int i = 0; i < 10; i++)
          array[i] = i; // not possible :(
   }
};

Однако, как справедливо отметили некоторые другие участники, кажется мало смысла иметь копию массива для каждого экземпляра T, если вы не можете изменять его элементы. Вместо этого вы можете использовать член static.

Итак, следующее в конечном итоге решит вашу проблему в том, что — вероятно, лучший способ:

struct T {
   static const unsigned int array[10];
};

const unsigned int T::array[10] = {0,1,2,3,4,5,6,7,8,9};

Надеюсь, что это поможет.

Ответ 2

Так как это переменная частного члена в классе (согласно комментарию), это действительно не разрешено в С++ 03.

С++ 0x, частично поддерживаемый многими современными компиляторами, позволяет скомпилировать следующее:

class C
{
    const unsigned int ARRAY[10];
 public:
    C() : ARRAY{0,1,2,3,4,5,6,7,8,9} {}
};
int main()
{
    C obj; // contains a non-static const member: non-assignable 
}

Однако нестатические константные члены имеют смысл только в том случае, если они содержат разные значения в разных экземплярах класса. Если каждый экземпляр должен содержать один и тот же {0,1,2,3,4,5,6,7,8,9}, тогда вы должны сделать его static, что также позволяет сделать это на С++ 98:

class C
{
    static const unsigned int ARRAY[10];
 public:
    C() {}
};
const unsigned int C::ARRAY[10] = {0,1,2,3,4,5,6,7,8,9};
int main()
{
    C obj;
}