2009-05-30 24 views
13

que tengo una clase y quiero tener algunas máscaras de bits con valores 0,1,3,7,15, ...declarar una matriz de INT const en C++

Así que, esencialmente quiero declarar una matriz de int constante tales como:

class A{ 

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

} 

pero el compilador siempre se quejará.

me trataron:

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

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

alguna idea sobre cómo se puede hacer esto?

Gracias!

Respuesta

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

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

Es posible que desee fijar la matriz dentro de la definición de clase ya, pero no tiene que hacerlo. La matriz tendrá un tipo completo en el punto de definición (que debe mantenerse dentro del archivo .cpp, no en el encabezado) donde puede deducir el tamaño del inicializador.

2
enum Masks {A=0,B=1,c=3,d=5,e=7}; 
+0

El problema con este enfoque es que quiero ser capaz de utilizarlo como una matriz. Por ejemplo, llame a una máscara de valor [3] y obtenga una máscara específica. –

+0

Ok. entendido. desea usar la respuesta de litbs, esa es la manera de hacerlo. – EvilTeach

9
// in the .h file 
class A { 
    static int const masks[]; 
}; 

// in the .cpp file 
int const A::masks[] = {0,1,3,5,7}; 
+0

Como agregar const en lugar de anteponer también funciona en situaciones más complicadas prefiero esta solución. –

2
  1. puede inicializar las variables sólo en el constructor u otros métodos.
  2. variables 'estáticas' deben inicializarse fuera de la definición de clase.

Usted puede hacer esto:

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

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

Bueno, esto es porque no se puede inicializar un miembro privado sin llamar a un método. Siempre uso Listas de inicialización de miembros para hacerlo const y miembros de datos estáticos.

Si no sabe qué son las listas de inicializadores de miembros, son justo lo que quiere.

mirada a este código:

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

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

} 

también GCC tiene esta extensión fresco:

const int a[] = { [0] = 1, [5] = 5 }; // initializes element 0 to 1, and element 5 to 5. Every other elements to 0. 
Cuestiones relacionadas