2011-05-28 15 views
8

Estoy intentando crear un constructor con un valor predeterminado. La complicación proviene del uso de encabezados separados y archivos de códigos para la clase. Tengo un archivo de cabecera que contiene:Archivo de encabezado de valor predeterminado del constructor C++

class foo { 
    bool dbg; 
    public: 
     foo(bool debug = false); 
} 

Y un archivo de código que contiene:

foo::foo(bool debug = false) { 
    dbg = debug; 
} 

Cuando intento compilar con g ++ (es decir g++ -c foo.cc), da un error:

foo.cc:373:65: error: default argument given for parameter 1 of ‘foo::foo(bool)’ 
foo.h:66:4: error: after previous specification in ‘foo::foo(bool)’ 

¿Qué estoy haciendo mal?

Respuesta

12

El valor predeterminado solo puede ir en el archivo de encabezado. Y el uso de valores predeterminados en los constructores (u otras funciones) rara vez es una buena idea, en mi experiencia, por lo general, suena como un error en alguna parte. ¡No quiero decir que no hay algunos en mi propio código!

+0

Gracias. Funciona :). Como puede ver en mi ejemplo, estoy haciendo esto para que se pueda proporcionar cierta información de depuración si es necesario. ¿Existe una forma recomendada de implementar esto, si no a través de valores predeterminados en los constructores? – Clivest

+0

@nbt A diferencia de la cadena de constructores? ¿Especialmente cuando hay muchos miembros que necesitan inicializarse? Me parece que esto es un beneficio pragmático para los valores de parámetro predeterminados en los constructores. – ybakos

4

El valor predeterminado debe estar solo en la declaración de la función, cuando la declaración y la definición están separadas.


podría añadir el valor por defecto como un comentario, si se quiere, pero debe tener en cuenta, porque al cambiar el valor por defecto y olvidarse de cambiar el comentario podría causar algo de engañoso (:

Por ejemplo :

foo(bool debug = false); 

//... 

foo::foo(bool debug /* = false */) 
{ /* ... */ } 
1

no necesita un argumento por defecto en la definición de la función miembro,

foo::foo(bool debug) { 
    dbg = debug; 
} 
8

no proporcionan el valor por defecto en la definición:

foo::foo(bool debug) { 
    dbg = debug; 
} 

Ahora es correcta. El valor predeterminado se debe proporcionar solo en la declaración , que ha realizado en el archivo de encabezado.

Por cierto, es preferible usar miembro de inicialización lista sobre las asignaciones:


Y, por supuesto, si su declaración-cum-definición, a continuación, debe proporcionar el valor predeterminado (si lo desea) a la derecha en la declaración-cum-definition:

class foo { 
    bool dbg; 
    public: 
     foo(bool debug = false) : dbg(debug) {} 
           //^^^^^^^^^^^ using member initialization list 
} 
2

En C++ (no sé de otros idiomas), los argumentos por defecto son una parte de la declaración de la función única & no de definición de función.

class foo { 
    bool dbg; 
    public: 
     foo(bool debug = false); 
} 

está muy bien, cambiar su Defintion a:

foo::foo(bool debug) { 
    dbg = debug; 
} 
Cuestiones relacionadas