2010-12-03 23 views
10

Probablemente esta sea una pregunta ridículamente fácil, pero he estado buscando la respuesta por un tiempo pero parece que no puedo resolver esto. Intento inicializar un puntero constante de variable constante en una clase. Aquí está el archivo de cabecera:Miembros constantes no inicializados en las clases

class Scheduler{ 
    public: 
    Scheduler(); 
    explicit Scheduler(unsigned long *); 

    private: 
    const unsigned long *const thresh; 

}; 

Y aquí es el constructor de la clase

Scheduler::Scheduler(unsigned long * threshold): 
    thresh(threshold) 
{} 

Cuando intento compilar este código me encuentro con este error:

scheduler.cpp: In constructor ‘Scheduler::Scheduler()’: 
scheduler.cpp:3: error: uninitialized member ‘Scheduler::thresh’ with ‘const’ type ‘const long unsigned int* const’ 

múltiples fuentes las variables de miembros constantes en línea en constructores para las variables miembro apuntan al uso de listas de inicializadores. Creo que estoy haciendo lo que se supone que debo hacer, pero aparentemente todavía no es bueno. ¿Alguien puede ver lo que está mal?

+0

Parece que su código falta la implementación del constructor predeterminado, que es de donde proviene el error. – visitor

Respuesta

14

debe inicializar el miembro de su constante en la lista de inicialización de TODAS constructores. Lo estás haciendo solo por el que tiene una discusión. Hazlo también por defecto, y todo será fne. En este caso particular, inicialice su umbral con 0 o deshabilite el constructor predeterminado.

+0

esto es exactamente lo que necesitaba. ¡Gracias! –

6

el problema está en el constructor por defecto, debe ser

Scheduler::Scheduler() : thresh(0) {} 

o no se aplique a todos.

0

Tu código funciona para mí (MSVC2010) - como creo que debería. ¿Con qué compilador estás intentando esto?
La única queja que un compilador puede/debería tener con el código es una advertencia de que el constructor de copia automática y el operador de asignación no se pueden crear debido al miembro de la estructura.

+0

Creo que te estás refiriendo a "advertencias tontas" de VC++. No tiene mucho sentido advertir acerca de estas cosas. – visitor

+0

Su kilometraje puede variar por supuesto ;-) Aún así, me faltaba el ctor predeterminado en mi respuesta - los otros carteles son correctos al decir que también es necesario inicializar el miembro de la const. – BuschnicK

+0

Entonces, ¿cómo puedo arreglar la advertencia? Yo heredo de 'boost :: noncopyable' para indicar que no se debe poder copiar/asignar la clase ... Dos nuevas advertencias: ¡ahora tampoco puede crear un constructor de copia implícito! D'oh. – UncleBens

Cuestiones relacionadas