[C con Clase] Buf.....un duda de esas básicas, por falta de unos buenos fundamentos.......
Steven Davidson
srd4121 en njit.edu
Lun Nov 21 12:52:30 CET 2011
Hola Miguel Ángel,
2011/11/21 Miguel Angel Torres Fernandez-piñar <miguelangeltorresfp en gmail.com>:
> Hola amigos del C++.....
>
> Esta duda es demasiado básica, pero le he dado muchas vueltas y no sé qué
> por qué no funciona :
>
Vamos a ver.
>
> class Persona {
> public:
> Persona(char *n) { strcpy(nombre, n); }
No aconsejo usar este prototipo. Como el constructor no tiene
intención de modificar el contenido de la cadena apuntada por 'n',
deberías indicarla escribiendo 'const'. Esto es,
Persona( const char *n ) { strcpy(nombre, n); }
Adicionalmente, esto nos permitirá enviar cadenas literales que por
definición son constantes, como has hecho más abajo en tus pruebas.
> const char *LeeNombre() const { return nombre; }
> protected:
> char nombre[30];
> };
>
>
> int main() {
>
> Persona( "Pepe" ); // Genial !!!.......no hay problema.
La verdad es que tal y como defines el constructor, esto sí sería un
problema, porque estarías pasando un 'const char *' a un parámetro de
tipo 'char *'. No puedes eliminar 'const' tan fácilmente, y en
particular, no en este caso ya que la cadena es originalmente
constante.
> }
>
> Pero si hago..........
>
> int main() {
>
> char nombre[10] = "Pepe";
> Persona( nombre ); // Entonces me da error y no entiendo por qué...........
No me da ningún y personalmente, no veo por qué debería hacerlo.
Instancias un objeto temporal, que obviamente se destruye al finalizar
la sentencia.
> }
>
>
> Seguro que es una tontería por eso, por falta de base, pero ahora mismo no
> caigo qué puede ser......
>
Si te da un error, sería mejor que compartieras el mensaje que te da y
"quién" te lo da: el compilador, el enlazador, o el sistema operativo.
Después de probar tus ejemplos, los cambié para ver si de verdad
funcionaban correctamente e hice esto:
int main()
{
cout << Persona( "Pepe" ).LeeNombre() << endl;
return 0;
}
Y la otra versión:
int main()
{
char nombre[10] = "Pepe";
cout << Persona( nombre ).LeeNombre() << endl;
return 0;
}
Ambas versiones compilaron y funcionaron correctamente al ser ejecutadas.
Espero que esto te oriente un poco.
Steven
Más información sobre la lista de distribución Cconclase