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.