[C con Clase] Buf.....un duda de esas básicas, por falta de unos buenos fundamentos.......

Asdrúbal Iván Suárez Rivera asdrubal.ivan.suarez.rivera en gmail.com
Lun Nov 21 19:00:47 CET 2011


Quiero añadir aquí una pequeña acotación.

SIEMPRE cuando se vaya a colocar una cadena de caracteres como parámetro de
una función, y la misma no va a ser modificada, usen el const. Esto por
motivos de seguridad. Aunque también (y personalmente lo recomiendo) se
podría usar la clase std::string para cadenas de carácteres. Las ventajas
son enormes

El 21 de noviembre de 2011 07:22, Steven Davidson <srd4121 en njit.edu>escribió:

> 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
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>



-- 
Asdrúbal Iván Suárez Rivera

*El éxito de alguien que enseña no es que sepa mucho, sino que lo poco que
sabe lo sepa hacer llegar.*
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20111121/8b6740c9/attachment.html>


Más información sobre la lista de distribución Cconclase