• Publicidad

No puedo crear más de un objeto

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

No puedo crear más de un objeto

Notapor mrkokito » 2012-04-14 05:24 @267

Hola a todos.

Querría pedirles un poco de ayuda pues no encuentro respuesta a mi problema. Llevo estudiando Perl unas semanas y se puede decir que todavía soy un novato en Perl, pero cuanto más estudio este lenguaje, más me doy cuenta de su potencial y por eso quiero seguir aprendiendo cosas...

Acostumbrado a la programación orientada a objetos, y después de haber estudiado la parte básica de un tutorial de Perl que poseo, he decidido empezar a crear algunas clases...

Mi problema viene cuando creo referencias/objetos de las clases que he creado. Si bien puedo crear uno, cuando creo más de un objeto obtengo un error en mi código y no sé por qué puede pasar esto... ¿Es que no se puede crear más de un objeto de la misma clase usando Perl?

Les paso el código que he creado por si me podrían decir qué estoy haciendo mal.

Esta es mi clase:
Sintáxis: (Gato.pm) [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. #use strict;
  3.  
  4. package Gato;
  5.  
  6. # Atributos de la clase
  7. my $cantidad = 0;
  8.  
  9. # Constructor y Destructor
  10. sub new {
  11.         my $clase = shift;
  12.         my $gato  = {@_};
  13.        
  14.         #atributos de la instancia
  15.         $gato->{nombre}    ||= undef;
  16.         $gato->{hambre}    ||= 5;
  17.         $gato->{cansancio} ||= 5;
  18.        
  19.         $cantidad++;
  20.         bless $gato,$clase;
  21.        
  22.         return $gato;
  23. }
  24.  
  25. sub DESTROY {
  26.         $cantidad--;
  27. }
  28.  
  29. # Accesores(get) y mutadores(set)
  30. sub get_nombre    { my $gato = shift; return $gato->{nomnbre};   }
  31. sub get_hambre    { my $gato = shift; return $gato->{hambre};    }
  32. sub get_cansancio { my $gato = shift; return $gato->{cansancio}; }
  33.  
  34. sub set_nombre {
  35.         my $gato  = shift;
  36.         my $nombre = shift;
  37.        
  38.         $gato->{nombre} = $nombre;
  39.        
  40.         return 1;
  41. }
  42. sub set_hambre {
  43.         my $gato  = shift;
  44.         my $hambre = shift;
  45.        
  46.         $gato->{hambre} = $hambre;
  47.        
  48.         return 1;
  49. }
  50. sub set_cansancio {
  51.         my $gato      = shift;
  52.         my $cansancio = shift;
  53.        
  54.         $gato->{cansancio} = $cansancio;
  55.        
  56.         return 1;      
  57. }
  58.  
  59. # Métodos de la instancia
  60.  
  61. #Si el gato come el nivel de hambre disminuye
  62. sub come {
  63.         my $gato = shift;
  64.        
  65.         $gato->{hambre}--;
  66.        
  67. }
  68.  
  69. #si el gato juega el nivel de cansancio aumenta
  70. sub juega {
  71.         my $gato = shift;
  72.        
  73.         $gato->{cansancio}++;
  74. }
  75.  
  76. #si el gato duerme el nivel de cansancio disminuye
  77. sub duerme {
  78.         my $gato = shift;
  79.        
  80.         $gato->{cansancio} -= 2;
  81. }
  82.  
  83. #si el gato vomita el nivel de hambre aumenta
  84. sub vomita{
  85.         my $gato = shift;
  86.        
  87.         $gato->{hambre} += 2;
  88. }
  89.  
  90. #Muesta el estado actual (nombre, nivel de hambre y cansancio) de un gato
  91. sub estado {
  92.         my $gato = shift;
  93.        
  94.         print "\nNombre del gato    : ",$gato->{nombre};
  95.         print "\nNivel de hambre    : ",$gato->{hambre};
  96.         print "\nNivel de cansancio : ",$gato->{cansancio};
  97.         print "\n\n";
  98. }
  99.  
  100. return 1;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Y esta la clase que uso para crear objetos de la clase Gato en ella:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3.  
  4. package Gato;
  5.  
  6. use Gato
  7.  
  8. my $gato1 = Gato->new(nombre=>"Isidoro", hambre=>10, cansancio=>10);
  9. my $gato2 = Gato->new(nombre=>"Misifu",  hambre=>3,  cansancio=>7);
  10.  
  11. print "\nEstado actual del gato: ";
  12.  
  13. $gato2->estado();
  14.  
  15. print "\nEstado actual de cansancio del gato: ",$gato2->get_cansancio();
  16. print "\nEl gato duerme"; $gato2->duerme();
  17. print "\nEstado de cansancio del gato después de dormir: ",$gato2->get_cansancio();
  18.  
  19. print "\n\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


La cuestión es que si creo sólo al objeto $gato2 y uso sus métodos, el ejemplo que me he creado funciona correctamente, pero cuando intento usar un método de la clase usando el objeto $gato1, todo deja de funcionar...

¿Qué es lo que estoy haciendo mal?

Muchas gracias de antemano por su ayuda y felicidades al creador de esta página. ¡¡¡Me parece un sitio perfecto para ir mejorando mis habilidades en Perl!!! ^_^
mrkokito
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2012-04-14 05:06 @254

Publicidad

Re: No puedo crear más de un objeto

Notapor explorer » 2012-04-14 10:45 @490

Bienvenido a los foros de Perl en Español, mrkokito.

Había unos pocos problemas sintácticos.

Esto es lo correcto:
En Gato.pm:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. our $cantidad = 0;     # no es necesario poner our().
  2.                                                    # Es solo para que el programa sepa cuántos gatos tenemos.
  3.                                                    # Con my() sigue siendo una var. local al package
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. 1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Es decir: no hay errores, solo cambios cosméticos.

Donde está el problema es en el programa:
  • Sobra la línea 4. Estamos en un programa, no re-definiendo al Gato.
  • Línea 6: te falta el carácter ';' al final de la línea (este es el error grave ;) )
Ahora ya funciona:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3.  
  4. use Gato;
  5.  
  6. my $gato1 = Gato->new(nombre=>"Isidoro", hambre=>10, cansancio=>10);
  7. my $gato2 = Gato->new(nombre=>"Misifu",  hambre=>3,  cansancio=>7);
  8.  
  9. print "\nEstado actual del gato1: ";
  10. $gato1->estado();
  11.  
  12. print "\nEstado actual de cansancio del gato: ",$gato1->get_cansancio();
  13. print "\nEl gato duerme"; $gato1->duerme();
  14. print "\nEstado de cansancio del gato después de dormir: ",$gato1->get_cansancio();
  15.  
  16. print "\n\n";
  17.  
  18. print "\nEstado actual del gato2: ";
  19. $gato2->estado();
  20.  
  21. print "\nEstado actual de cansancio del gato: ",$gato2->get_cansancio();
  22. print "\nEl gato duerme"; $gato2->duerme();
  23. print "\nEstado de cansancio del gato después de dormir: ",$gato2->get_cansancio();
  24.  
  25. print "\n\n";
  26.  
  27. print "Gatos: ", $Gato::cantidad, "\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Estado actual del gato1:
Nombre del gato    : Isidoro
Nivel de hambre    : 10
Nivel de cansancio : 10


Estado actual de cansancio del gato: 10
El gato duerme
Estado de cansancio del gato después de dormir: 8


Estado actual del gato2:
Nombre del gato    : Misifu
Nivel de hambre    : 3
Nivel de cansancio : 7


Estado actual de cansancio del gato: 7
El gato duerme
Estado de cansancio del gato después de dormir: 5

Gatos: 2
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Te recomiendo que, una vez que entiendas las bases de la POO en Perl (y se ve que es así), te pongas, inmediatamente, a estudiar Moose, que es lo más avanzado actualmente en POO. Aquí está el manual: Moose::Manual, y el recetario: Moose::Cookbook.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: No puedo crear más de un objeto

Notapor mrkokito » 2012-04-14 12:05 @545

¡Muchas gracias por tu ayuda, explorer! ¡¡¡Gracias a ti esta noche podré dormir!!! :lol:
mrkokito
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2012-04-14 05:06 @254


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 32 invitados