Está en la página 1de 6

 

Programación Orientada a Objetos 
http://bit.ly/poouja 
 
Curso 2015/2016 
José Ramón Balsas Almagro 
  Víctor Manuel Rivas Santos 
Ángel Luis García Fernández 

 
 

Práctica 3. Clases y Objetos (2) 
Objetivos 
● Saber declarar, inicializar y usar variables y métodos de clase. 
● Gestión de errores con excepciones que son clases. 

Contenidos 
Contexto de la práctica 
Material de partida 
Ejercicios 
Contenidos 
Variables de clase 
Métodos de clase 

Contexto de la práctica 
El  contexto  es  exactamente  el  mismo  que  el  de  la  práctica 2,  al ser esta la segunda sesión en 
la que vamos a seguir trabajando en el programa del ​ DJ Segismundo Barcetres Rodríguez.​  

Material de partida 
● Puedes  usar  el  proyecto  que  realizaste  en  la  sesión  anterior.  Cópialo  a  un  nuevo 
proyecto antes de hacer ninguna modificación y podrás conservar los dos. 
● Si  lo  deseas,  también  puedes  descargarte  el  código  que  hemos  creado  en   GitHub  o 
incluso  hacerle  un  fork  y  empezar  a  trabajar  a  partir  de  él.  Lo  puedes  localizar  en 
http://bit.ly/poouja1516mat03 

Ejercicios 
 

1/6 
1.  ParametroNoValido​
Crea  la  clase  ​ ;  servirá  para  lanzar  excepciones  de  este  tipo  en  los 
ejercicios que vendrán a continuación. La clase debe tener los siguientes atributos: 
● Fichero​
: String. Nombre del fichero en el que se realiza el throw de la excepción 
● Funcion​
: String. Nombre de la función o método en el que se realiza el throw. 
● Descripción​
: String. Una descripción del error ocurrido. 
QueOcurre()​
Además  del  constructor  parametrizado,  añadir  un  método  llamado ​ , que devuelva 
Fichero, Función y Descripción.​
un string concatenando los atributos ​  

2.​ Temazo​
 Añade a la clase ​  las variables de clase: 
● numTemazos​
: entero 
● puntuacionTotal​
: entero 
Ambas son de tipo entero y se inicializan a 0. 

3.​
 Añade también a la clase Temazo los siguientes métodos de clase privados: 
● incrementarPuntuacionTotal( int puntos ) 
● decrementarPuntuacionTotal( int puntos ) 
Teniendo  en  cuenta  que  ambos  métodos  deben  lanzar  excepciones  (del  tipo  declarado  en  el 
ejercicio  1)  tanto  si  el  parámetro  ​
puntos  que  se  les  pasa  es  menor  que  0,  como  si  es  mayor 
que 10. 

4.  Modifica  los  constructores  de  la  clase  Temazo  para  que  cada  vez  que se  cree un  nuevo 
objeto  se  incremente  en  1  el  número  de  temazos  y,  utilizando  el  método  estático 
incrementarPuntuacionTotal​
,  se  añadan  los  puntos   que  se  indiquen  en  el  constructor  a  la 
puntuación  total.  Por  supuesto,  debe  recuperar  la  excepción  que  se   lance  en  caso  de  que 
ocurra. 

5. Igualmente,  modifica  el destructor para que se decremente en 1 el número de temazos y se 


le  reste  la  puntuación  del  objeto  que  se   está  destruyendo  a  la  puntuación  total  (usando  para 
decrementarPuntuaciónTotal).​
esto último el método estático ​   

6.​ Temazo​
 Añade finalmente a la clase ​  los métodos: 
● incrementarPuntuacion(  int  puntos  )​
.  Este  método  debe  lanzar  una  excepción  del  tipo 
puntos ​
definido en el ejercicio 1 si el parámetro ​ es menor que 0 o mayor que 10. 
● debeEstarEnLaLista()​
. Este método devuelve ​
true si  la puntuación del temazo es mayor 
false ​
o igual que la puntuación media de todos los temazos, y ​ si no es así. 
Por  supuesto,  estos  métodos  deben  hacer  uso  de  los  métodos  y  variables  de  clase  creados  
anteriormente  
(​
Nota:  puedes  calcular  fácilmente  la  puntuación  media  de  los  temazos  dado  que  tienes 

2/6 
almacenados  en  sendas  variables  estáticas  tanto  el  número  de  temazos  que  hay  como   la 
puntuación total). 

7.  En  la  función  main,  y  teniendo  en  cuenta  que  debes  capturar  y  manejar  las  excepciones 
que pudieran lanzarse: 
● entradaTriunfal,​
Crea  un  objeto  de  tipo  Temazo.  Dicho  objeto  se  llamará  ​   y  tendrá  una 
puntuación de 100. El título y el intérprete pueden ser los que desees. 
● Crea  un  vector  que  pueda  almacenar  hasta  10  objetos  de  tipo  Garito. Modifica  los dos 
primeros cambiando su nombre y dirección. 
● Crea  un  vector  que  pueda  almacenar  hasta  50  objetos  de  tipo  Temazo.  Modifica  las  3 
primeras  posiciones,  con  datos  (título,   intérprete…)  de  tu   elección.  Todos  deben  tener 
su puntuación a 0. 
● Utiliza  las  funciones  auxiliares  de  la  biblioteca  para  mostrar  los  datos   del  objeto 
entradaTriunfal​
, de los 10 objetos de tipo Garito y  de los 3 objetos de tipo temazo. 
● Utiliza  las  funciones  auxiliares  de  la  biblioteca  para  modificar  los  datos  (nombre  y 
dirección)   de  los  garitos  ubicados  en   las  posiciones   6  y 8 del vector, y luego muéstralo 
por pantalla. 
● Utiliza  un  bucle  que  recorra  las  3  posiciones  instanciadas  del  vector  de   temazos,  de 
modo  que  incremente  la  puntuación  del  primer  tema  en  5  puntos, del segundo en 10 y 
del  tercero  en 15. No olvides capturar las excepciones que pudieran ocurrir y  mostrar la 
información que proporcionan.  
● Posteriormente,  usa  de  nuevo  un  bucle  para  recorrer  el  vector  de  temazos  de  forma 
que  se  muestren  por  pantalla   los  datos  de  los  temazos  que  deberían  estar  en  la  lista 
debeEstarEnLaLista() ​
de reproducción (es decir, aquellos cuyo método ​ true​
devuelve ​ ). 

Contenidos 
Variables de clase 
Al  definir  una  nueva  clase,  definimos  los  atributos  y  métodos  que  tendrán  los  objetos  que 
definamos  posteriormente.  Normalmente,  cada  uno  de  los  objetos  que  definamos almacenará 
sus  valores  específicos  para  cada  uno  de  los  atributos,  es  por  ello  que  normalmente  a  los 
atributos  se  les  llama  variables  de  instancia, porque sus valores variarán para cada una  de las 
instancias declaradas. 

Sin  embargo,  es  posible  definir  atributos  que  estén  compartidos  por  todos  los  objetos  de  una 
misma  clase;  son  las  variables  de  clase.  Así,  para  cada  objeto  instanciado  se  reservará 
memoria  para  cada  una  de  sus variables de instancia, sin embargo sólo se  reservará memoria 
una  vez  para  cada  variable  de  clase. Todos los objetos de la clase compartirán dicha variable, 

3/6 
pudiendo acceder a ella y modificarla (en caso de que no haya definido como constante). 

La  inclusión  de  una  variable  de  clase  se  realiza  poniendo  la  palabra  reservada  ​
static  delante 
de la declaración del atributo, como en el siguiente ejemplo: 

static int contador; 

En  el  siguiente  ejemplo  mostramos una implementación de la clase ​


Fecha con una variable de 
clase que almacena el instante en que se creó la última instancia perteneciente a dicha clase. 

/// @file Fecha.h 
#include <ctime> 
 
class Fecha { 
int dia, mes, anio; 
static time_t ultimaInstanciacion; 
 public: 
Fecha ( const int d, const int m, 
        const int a, time_t &demora ); 
int getDia() const; 
void setDia( const int d ); 
 private: 
void incrementaAnio(); 
}; 

La  nueva  variable  de  clase  creada  puede  ser  usada  desde  cualquier  método  de   la  clase. 
Continuando  con  nuestro  ejemplo,  vamos  a  mostrar  cómo  se  podría  indicar  desde  el 
constructor  de  la clase los segundos que han pasado desde la instanciación del anterior objeto 
de la clase: 

/// @file Fecha.cpp 
#include "Fecha.h" 
 
// Inicialización de las variables de clase 
time_t Fecha::ultimaInstanciacion=time( 0 ); 
 
Fecha::Fecha ( const int d, const int m, 
               const int a, time_t &demora ) 
             : dia(d), mes(m), anio(a) 

// Actualiza el parámetro por referencia con el tiempo 

4/6 
// transcurrido desde que se instanció el objeto anterior 
time_t actualInstaciacion = time(0); 
demora = actualInstaciacion ­ ​
ultimaInstanciacion​
; 
 
// Modifica la variable de clase, para que guarde el 
// instante de la instanciación del último objeto 
ultimaInstanciacion ​
= actualInstanciacion; 

// No se incluye la implementación del resto de los métodos de 
// la clase 

En  el  ejemplo  anterior,  cada  vez  que  se  ejecute  el  constructor  de  Fecha  nos  devolverá,  en  el 
demora​
parámetro  ​ ,  cuántos  segundos  han  pasado  desde  la  última  vez  que  se  instanció  un 
objeto  de  esa  clase.  Este  ejemplo  muestra  una  característica  fundamental  de  las variables de 
clase:  deben  ser  inicializadas  antes  de  poder  ser  usadas.  Como  se  puede  observar,  hemos 
inicializado  la  variable  dentro  del   fichero   .cpp,  en  una  instrucción  que  está  fuera  de  cualquier 
método de la clase. 

Métodos de clase 
Son  los  métodos  de  una clase que van precedidos por el modificador ​
static en su declaración. 
Los  métodos  de  clase no van dirigidos a ningún objeto de la clase; de hecho, no tienen  acceso 
this​
al  atributo  ​ .  Por  este  motivo,  deben ser llamados utilizando la sintaxis de acceso al espacio 
de nombres que define la propia clase: 

NOMBRECLASE::METODOESTATICO(parámetros); 

El  objetivo   de  estos  métodos  es  agrupar  dentro  de  la  clase  funciones  genéricas  relacionadas 
con  el  cometido  de  la  clase,  pero  que  no  van  dirigidas  a  ningún  objeto  en particular.  Además, 
pueden  ser  utilizadas  en  cualquier  momento  sin  ambigüedad  por  el  usuario, puesto que están 
declaradas dentro de un espacio de nombres específico. 

En  el  ejemplo  anterior  de  la  clase  Fecha,  podríamos  definir  un   método  de  clase  para 
comprobar  si  un  año  es  bisiesto  o  no.  En  este  caso,  este  método  no  necesita  ir  dirigido  a  un 
objeto  de  la  clase  fecha  en  particular,  sino  que  podría  ser  utilizado  por estos como función de 
apoyo o por el usuario de forma independiente: 

/// @file Fecha.h 
class Fecha { 
/*...*/ 
static bool esBisiesto(const int anio); 

5/6 
/*...*/ 
}; 
 
/// @file Fecha.cpp 
     ​
bool Fecha::esBisiesto (const int anio)​

/*...*/ 

 
/// @file main.cpp 
int main () { 
time_t aux; 
Fecha diaConstitucion ( 6, 12, 2016, aux ); 
 
if ( ​
Fecha::esBisiesto​
 ( diaConstitucion.getAnio() ) || 
     ​
Fecha::esBisiesto​
 ( 2021 ) ) { 
/* Hacer algo si alguno de los dos años es bisiesto */ 
           } 

 
 

6/6 

También podría gustarte