[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