2012-03-21 20 views
5

Tengo un problema al especificar los valores predeterminados para mis miembros de la clase C++. Mi código es:C++: valores predeterminados en el miembro de la clase

De Someclass.h:

class SomeClass 
{ 
public: 
    SomeClass(); 
    ~SomeClass(); 
    void printOut (bool); 
} 

... desde SomeClass.cpp:

void SomeClass::printOut(bool foobar=true) 
{ 
    if (foobar) { std::cout << foobar << std::endl; } 
} 

... y finalmente, desde main.cpp :

int main() 
{ 
    SomeClass s; 
    s.printOut(); 
    return 0; 
} 

Sin embargo, esto da mensaje de error (gcc):

../main.cpp: In function `int main()': 
../main.cpp:8: error: no matching function for call to `SomeClass::printOut()' 
../SomeClass.h:18: note: candidates are: void SomeClass::printOut(bool) 
subdir.mk:21: recipe for target `main.o' failed 
make: *** [main.o] Error 1 

He intentado especificar el valor por defecto directamente en la declaración de clase en el archivo de cabecera, etc. También he intentado buscar tanto el desbordamiento de pila y Google en general, pero no puede encuentra cualquier solución en cualquier lugar. ¿Qué estoy haciendo mal?

Respuesta

6

No ha especificado el valor predeterminado para el parámetro en la cabecera como tal, el compilador busca una función de firma void printOut(void) para su declaración s.printOut(); pero no la encuentra correctamente. Lo que necesita es:

class SomeClass 
{ 
public: 
    SomeClass(); 
    ~SomeClass(); 
    void printOut(bool fValue = true); // Note change in param in definition 
} 

Y en su CPP:

void SomeClass::printOut(bool foobar /*=true*/) 
{ 
    if (foobar) { std::cout << foobar << std::endl; } 
} 

Como nota al margen, ten en cuenta que no tiene que poner el valor predeterminado comentada para el parámetro en la puesta en práctica archivo, pero es una buena idea para la legibilidad.

+0

Podría haber jurado que lo intenté. : -S Sin embargo, como seguramente no lo hice, funcionó perfectamente y estoy muy agradecido por su ayuda, ¡gracias! – gustafbstrom

+0

Es un placer, me alegro de poder ayudar. – Konrad

1

El valor predeterminado debe especificarse en la declaración del método, no en la implementación.

+0

Gracias. Eso hizo el truco! – gustafbstrom

4

Debe declarar el valor predeterminado dentro de la definición de la clase, no en la implementación.

class SomeClass 
{ 
public: 
    SomeClass(); 
    ~SomeClass(); 
    void printOut (bool foobar = true); //move default here 
} 

void SomeClass::printOut(bool foobar)  //remove from here 
{ 
    if (foobar) { std::cout << foobar << std::endl; } 
} 

Además, tenga en cuenta que:

SomeClass s(); 

no hace lo que se espera que haga. No crea un objeto s del tipo SomeClass, pero declara una función s con el tipo de retorno SomeClass. s.printOut(); no debe compilarse.

es probable que desee:

SomeClass s; 
+0

Podría haber jurado que lo intenté. : -S Sin embargo, como seguramente no lo hice, funcionó perfectamente y estoy muy agradecido por su ayuda, ¡gracias! Además, gracias por señalar el problema s(), que en realidad era un error tipográfico en este caso. ¡Muestra verdaderas habilidades para leer códigos! – gustafbstrom

1

Los parámetros por defecto se deben definir en la cabecera de la siguiente manera:

class SomeClass 
{ 
public: 
    SomeClass(); 
    ~SomeClass(); 
    void printOut (bool value = true); 
} 
1

reescriba como sigue ..nota bool b = false

class SomeClass 
{ 
public: 
    SomeClass(); 
    ~SomeClass(); 
    void printOut (bool b=false); 
} 
1

intenta especificar el valor predeterminado en el archivo de cabecera:

class SomeClass 
{ 
public: 
    SomeClass(); 
    ~SomeClass(); 
    void printOut (bool foobar=true); 
} 
0

valor por defecto tiene que ser designado en la declaración y no en la definición. Puede especificar el valor predeterminado en ambos lugares pero no puede omitir desde la definición. espero que no te confunda. Voy a mostrar el e \ código corregido para que pueda entender:

class SomeClass 
{ 
public: 
    SomeClass(); 
    ~SomeClass(); 
    void printOut (bool foobar = true); 
} 

... desde SomeClass.cpp:

void SomeClass::printOut() //or you can use: void SomeClass::printOut(bool foobar=true) 
{ 
    if (foobar) { std::cout << foobar << std::endl; } 
} 

... y finalmente, desde main.cpp:

int main() 
{ 
    SomeClass s(); 
    s.printOut(); 
    return 0; 
} 
+0

Esto no compilará, la firma en su implementación es incorrecta – Konrad

+0

¿de qué línea de código está hablando? –

+0

Gracias, esto hizo el truco. La fila 'SomeClass s();' era en realidad un error que, por supuesto, debería ser simplemente 'SomeClass s;' Gracias por señalar, sin embargo. – gustafbstrom

Cuestiones relacionadas