variable usar son qué programacion poo modificador metodos los estáticos estaticos cuando clase atributos c++ gcc const switch-statement

c++ - usar - Por qué los miembros static const no pueden aparecer en una expresión constante como ''switch''



static programacion java (3)

Los problemas que ves se deben al hecho de que esto

static const unsigned char sInvalid;

no puede ser una expresión constante de tiempo de compilación, ya que el compilador no conoce su valor. Inicialízalos en el encabezado así:

class MyClass : public MyBase { public: static const unsigned char sInvalid = 0; ...

y funcionará

Tengo la siguiente declaración de algunos miembros static const

.marido

class MyClass : public MyBase { public: static const unsigned char sInvalid; static const unsigned char sOutside; static const unsigned char sInside; //(41 more ...) }

.cpp

const unsigned char MyClass::sInvalid = 0; const unsigned char MyClass::sOutside = 1; const unsigned char MyClass::sInside = 2; //and so on

En algún momento quiero usar esos valores en un cambio como:

unsigned char value; ... switch(value) { case MyClass::sInvalid : /*Do some ;*/ break; case MyClass::sOutside : /*Do some ;*/ break; ... }

Pero obtengo el siguiente error de compilación: error: ''MyClass :: sInvalid'' no puede aparecer en una expresión constante .

He leído otras palabras "cambiar-no-parece-constante-cosas" y no encontré una respuesta para mí, ya que no entiendo por qué esos caracteres static const unsigned char no son expresión constante.

Estoy usando gcc 4.5.


Los valores son de hecho const , pero no son constantes de tiempo de compilación .

Una condición de switch se resuelve en tiempo de compilación, no en tiempo de ejecución. Puede inicializar sInvalid a cualquier valor, siempre que solo sea una vez, y el switch nunca lo sabrá hasta el tiempo de ejecución.

Parece que es mejor usar enum s en lugar de constantes static . Además del hecho de que funcionaría, parece más apropiado para el diseño.


Puede usar el truco enum para hacerlos constantes en tiempo de compilación:

class MyClass { public: enum { sInvalid, sOutside, sInside, //(41 more ...) }; };

En su código, aún puede usar la enumeración para asignar a char sin signo, algo como esto:

int main(int argc, char *argv[]) { unsigned char buf[32]; buf[0] = MyClass::sInvalid; //int to unsigned char return buf[0]; //Cast back to int (and avoid a warning a -Wall) }

Y use MyClass::sInvalid en sus declaraciones swith.