Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
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;
/// @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