объявить массив константных целых в C ++ - PullRequest
13 голосов
/ 30 мая 2009

У меня есть класс, и я хочу иметь несколько битовых масок со значениями 0,1,3,7,15, ...

Так что, по сути, я хочу объявить массив констант, таких как:

class A{

const int masks[] = {0,1,3,5,7,....}

}

но компилятор всегда будет жаловаться.

Я пытался:

static const int masks[] = {0,1...}

static const int masks[9]; // then initializing inside the constructor

Есть идеи, как это можно сделать?

Спасибо!

Ответы [ 5 ]

24 голосов
/ 30 мая 2009
class A {
    static const int masks[];
};

const int A::masks[] = { 1, 2, 3, 4, ... };

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

9 голосов
/ 30 мая 2009
// in the .h file
class A {
  static int const masks[];
};

// in the .cpp file
int const A::masks[] = {0,1,3,5,7};
2 голосов
/ 04 марта 2014

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

Если вы не знаете, что такое Списки инициализаторов , это именно то, что вам нужно.

Посмотрите на этот код:

    class foo
{
int const b[2];
int a;

foo():    b{2,3}, a(5) //initializes Data Member
{
//Other Code
}

}

Также у GCC есть это классное расширение:

const int a[] = { [0] = 1, [5] = 5 }; //  initializes element 0 to 1, and element 5 to 5. Every other elements to 0.
2 голосов
/ 30 мая 2009
  1. Вы можете инициализировать переменные только в конструкторе или других методах.
  2. 'статические' переменные должны быть инициализированы из определения класса.

Вы можете сделать это:

class A {
    static const int masks[];
};

const int A::masks[] = { 1, 2, 3, 4, .... };
2 голосов
/ 30 мая 2009
enum Masks {A=0,B=1,c=3,d=5,e=7};
...