Sei sulla pagina 1di 61

Tema 4 Genericidad

Programacin Orientada a Objetos


Curso 2010/2011
Contenido

 Genericidad en Java.

 Colecciones en Java.

 Genericidad en C++.

 Colecciones en C++.

Curso 2010/2011 Programacin Orientada a Objetos 2


Genericidad en Java
 Facilidad de un lenguaje de programacin para definir
clases parametrizadas con tipos de datos.

 Resultan de utilidad para la implementacin de tipos de


datos contenedores como las colecciones.

 La genericidad slo tiene sentido en lenguajes con


comprobacin esttica de tipos, como Java.

 La genericidad permite escribir cdigo reutilizable.

Curso 2010/2011 Programacin Orientada a Objetos 3


Clase Contenedor
public class Contenedor<T> {

private T contenido;

public void setContenido(T contenido) {

this.contenido = contenido;
}

public T getContenido() {

return contenido;
}
}

Curso 2010/2011 Programacin Orientada a Objetos 4


Genericidad
 La parametrizacin de una clase genrica se realiza en la
declaracin de una variable y en la construccin.

Contenedor<String> contenedor =
new Contenedor<String>();

contenedor.setContenido("hola");

Curso 2010/2011 Programacin Orientada a Objetos 5


Operaciones sobre tipos genricos
 Podemos aplicar la asignacin (=) y la comparacin de
identidad (== o !=).

 Tambin las operaciones aplicables sobre cualquier objeto


(mtodos de la clase Object)

 Dentro de la clase genrica, no es posible construir


objetos de un tipo genrico:
 T contenido = new T(); // No compila

 Es posible aplicar ms operaciones aplicando


genericidad restringida.

Curso 2010/2011 Programacin Orientada a Objetos 6


Genericidad
 Una clase genrica es una clase normal, salvo que dentro
de su declaracin utiliza un tipo variable (parmetro), que
ser definido cuando sea utilizada.
 Dentro de una clase genrica se pueden utilizar otras
clases genricas.
 Una clase genrica puede tener varios parmetros.

public class ContenedorDoble <T,K> {


private String nombre;
private Contenedor<T> clave;
private K valor; }

ContenedorDoble<String, Cuenta> contenedor =

Curso 2010/2011 Programacin Orientada a Objetos 7


Genericidad y tipos primitivos
 Las clases genricas no pueden ser parametrizadas a
tipos primitivos.
 Para resolver este problema el lenguaje define clases
envoltorio de los tipos primitivos:
 Integer, Float, Double, Character, Boolean, etc.
 El compilador transforma automticamente tipos primitivos
en clases envoltorio y viceversa: autoboxing.

Contenedor<Integer> contenedor =
new Contenedor<Integer>();
contenedor.setContenido(10);
int valor = contenedor.getContenido();

Curso 2010/2011 Programacin Orientada a Objetos 8


Genericidad restringida
 Objetivo: limitar los tipos a los que puede ser
parametrizada una clase genrica.

 Al restringir los tipos obtenemos el beneficio de poder


aplicar mtodos sobre los objetos de tipo genrico.

 Una clase con genericidad restringida slo permite ser


parametrizada con tipos compatibles con el de la
restriccin (clase o interfaz).

Curso 2010/2011 Programacin Orientada a Objetos 9


Genericidad restringida
 La clase CarteraAhorro slo puede ser parametrizada
con tipos compatibles con Deposito.
 Podemos aplicar mtodos disponibles en la clase
Deposito.

public class CarteraAhorro<T extends Deposito> {

private LinkedList<T> contenido;

public void liquidar() {


for (T deposito : contenido)
deposito.liquidar();
}
}

Curso 2010/2011 Programacin Orientada a Objetos 10


Genericidad restringida
 Una clase genrica puede estar restringida por
varios tipos:

public class Contenedor<T extends Deposito & Amortizable>

 Por tanto, las operaciones disponibles para objetos


de tipo T son las de todos los tipos.

Curso 2010/2011 Programacin Orientada a Objetos 11


Genericidad y herencia
 Una clase puede heredar de una clase genrica.
 La nueva clase tiene las opciones:
 Mantener la genericidad de la clase padre.
public class CajaSeguridad<T> extends Contenedor<T>

 Restringir la genericidad.

public class CajaSeguridad<T extends Valorable>


extends Contenedor<T>

 No ser genrica y especificar un tipo concreto.

public class CajaSeguridad extends Contenedor<Valorable>

Curso 2010/2011 Programacin Orientada a Objetos 12


Genericidad y sistema de tipos

Contenedor<Deposito>
Deposito
No hay relacin

DepositoEstructurado Contenedor<DepositoEstructurado>

Contenedor<Deposito> cDeposito;
Contenedor<DepositoEstructurado> cEstructurado;

cDeposito = cEstructurado; // No compila

Curso 2010/2011 Programacin Orientada a Objetos 13


Genericidad y sistema de tipos
 Cuando se declara una variable cuyo tipo se corresponde
con una clase genrica y no se especifica el parmetro se
asigna el tipo puro (raw) que corresponde a:
 Sin genericidad restringida, la clase Object.
 Con genericidad restringida, la clase a la que se restringe.

Contenedor contenedor = new Contenedor(); // Object


CarteraAhorro cartera = new CarteraAhorro(); // Deposito

 Siendo:
 Clase Contenedor<T>
 Clase CarteraAhorro<T extends Deposito>

Curso 2010/2011 Programacin Orientada a Objetos 14


Genericidad y tipos comodn
 El mtodo slo permite objetos de tipo List<Deposito>.

public double posicionGlobal(List<Deposito> depositos) {

double posicion = 0;
for (Deposito deposito : depositos) {

posicion += deposito.getCapital();
}
return posicion;
}

 Cmo podemos pasar un lista de depsitos estructurados?

Curso 2010/2011 Programacin Orientada a Objetos 15


Genericidad y tipos comodn
public double posicionGlobal(
List<? extends Deposito> depositos)

 Se utiliza un comodn, que significa: permite cualquier


lista genrica parametrizada a la clase Depsito o a un
tipo compatible (subclase).
 Si pasamos como parmetro un objeto
List<DepositoEstructurado>, ste ser el tipo
reconocido dentro del mtodo.
 El tipo comodn se puede usar para declarar variables
locales o atributos.
 No se puede utilizar el tipo comodn para construir objetos.

Curso 2010/2011 Programacin Orientada a Objetos 16


Genericidad y mquina virtual
 La mquina virtual no maneja objetos de tipo genrico.
 En tiempo de ejecucin se pierde la informacin sobre el
tipo utilizado para parametrizar la clase genrica.
 Todo tipo genrico (clase genrica parametrizada) se
transforma a un tipo puro.
 Con el operador instanceof slo podemos preguntar por
el nombre de la clase.

// No compila
if (contenedor instanceof Contenedor<Deposito>) { }

// S compila
if (contenedor instanceof Contenedor) { }

Curso 2010/2011 Programacin Orientada a Objetos 17


Genericidad basada en Object
 La genericidad fue introducida en Java a partir de la
versin 5.

 Antes de esa versin, las clases genricas se definan


utilizando el tipo Object en lugar de un tipo genrico.

 Una referencia de tipo Object puede referenciar a


cualquier objeto.

 Este modelo est en desuso, aunque an existe cdigo


que trabaja con la genericidad basada en Object.

Curso 2010/2011 Programacin Orientada a Objetos 18


Genericidad basada en Object
public class Contenedor {

private Object contenido;

public void setContenido(Object contenido) {

this.contenido = contenido;
}

public Object getContenido() {

return contenido;
}
}

Curso 2010/2011 Programacin Orientada a Objetos 19


Genericidad basada en Object
 El compilador no ayuda en el control de tipos.
 El uso correcto de los tipos queda en manos del
programador.
 Para extraer objetos es necesario hacer siempre un casting
que podra fallar.

Contenedor contenedor =
new Contenedor ();
contenedor.setContenido("hola");

Deposito d = (Deposito)contenedor.getContenido();
// Error de casting en tiempo de ejecucin.

Curso 2010/2011 Programacin Orientada a Objetos 20


Seminario 3
 En el Seminario 3 se incluye un apartado que trata la
genericidad.

 Se incluyen los siguientes ejemplos:


 Genericidad basada en Object.
 Definicin de una clase genrica.
 Genericidad restringida.

Curso 2010/2011 Programacin Orientada a Objetos 21


Colecciones en Java
 Las colecciones en Java son un ejemplo destacado de
implementacin de cdigo reutilizable utilizando un
lenguaje orientado a objetos.
 Todas las colecciones son genricas.
 Los tipos abstractos de datos se definen como interfaces.
 Se implementan clases abstractas que permiten
factorizar el comportamiento comn a varias
implementaciones.
 Un mismo TAD puede ser implementado por varias clases
 List: LinkedList, ArrayList

Curso 2010/2011 Programacin Orientada a Objetos 22


Colecciones en Java. Paquete java.util
devuelve devuelve
Iterator Collection Map

devuelve

ListIterator List Set SortedMap AbstractMap

AbstractCollection SortedSet TreeMap HashMap

AbstractList AbstractSet

extends
HashSet TreeSet implements
interface
ArrayList AbstractSequentialList
class
LinkedList
Curso 2010/2011 Programacin Orientada a Objetos 23
Interfaz Collection<T>
 Define las operaciones comunes a todas las colecciones
de Java.

 Permite manipular colecciones basndonos en su interfaz


en lugar de en la implementacin.

 Los tipos bsicos de colecciones son:

 Listas, definidas en la interfaz List<T>

 Conjuntos, definidos en la interfaz Set<T>

Curso 2010/2011 Programacin Orientada a Objetos 24


Interfaz Collection<T>
 Operaciones bsicas:
 size(): devuelve el nmero de elementos.
 isEmpty(): indica si tiene elementos.
 add(T e): aade un elemento a la coleccin.
 Retorna un booleano indicando si acepta la insercin.
 remove(Object e): intenta eliminar el elemento.
 Retorna un booleano indicando si ha sido eliminado.
 clear(): elimina todos los elementos.
 contains(Object e): indica si contiene el objeto
pasado como parmetro.

Curso 2010/2011 Programacin Orientada a Objetos 25


Interfaz List<T>
 La interfaz List<T> define secuencias de elementos a los
que se puede acceder atendiendo a su posicin.

 Las posiciones van de 0 a size()-1.


 El acceso a una posicin ilegal produce la excepcin
IndexOutOfBoundsException
 El mtodo add(T e) aade al final de la lista.
 Aade a las operaciones de Collection mtodos de
acceso por posicin como:
 T get (int index)
 T set (int index, T element)
 void add (int index, T element)
 T remove (int index)

Curso 2010/2011 Programacin Orientada a Objetos 26


Implementaciones de Listas
 ArrayList<T>
 Implementacin basada en arrays redimiensionables.
 Operaciones de insercin y modificacin ineficientes.
 Operaciones de creacin y consulta rpidas.

 LinkedList<T>
 Implementacin basada en listas doblemente enlazadas
 Inserciones y modificaciones rpidas, especialmente en el
principio y el final:
 addFirst, addLast, removeFirst, removeLast
 Acceso aleatorio a elementos ineficiente
 Acceso eficiente al principio y al final de la lista:
 getFirst y getLast

Curso 2010/2011 Programacin Orientada a Objetos 27


Ejemplo uso de listas

import java.util.List;
import java.util.LinkedList;

public class Persona {


private final String dni;
private String nombre;
private LinkedList<ProductoFinanciero> productosContratados;

public Persona(String dni, String nombre){


this.dni = dni;
this.nombre = nombre;
productosContratados =
new LinkedList<ProductoFinanciero>();
}

Curso 2010/2011 Programacin Orientada a Objetos 28


Ejemplo uso de listas
public void addProducto(ProductoFinanciero producto){
productosContratados.add(producto);
}

public void removeProducto(ProductoFinanciero producto){


productosContratados.remove(producto);
}

public List<ProductoFinanciero> getProductosContratados(){


return new LinkedList<ProductoFinanciero>(
productosContratados);
}
}

 Se debe utilizar el tipo de la interfaz como valor de retorno.

 Todas las colecciones disponen del constructor de copia.


Curso 2010/2011 Programacin Orientada a Objetos 29
Conjuntos: Set<T> y SortedSet<T>
 La interfaz Set<T> define conjuntos de elementos no
repetidos.
 Para evitar la insercin de elementos repetidos, la igualdad
de los objetos se comprueba con equals.
 La interfaz SortedSet<T> extiende Set<T> con la
funcionalidad para conjuntos de elementos ordenados
 Los mtodos first y last devuelven el primer y el ltimo
elemento de acuerdo a la relacin de orden.
 Tambin proporciona mtodos para obtener subconjuntos:
 SortedSet<T> headSet (T toElement)
 SortedSet<T> tailSet (T fromElement)
 SortedSet<T> subSet (T fromElement ,T toElement)

Curso 2010/2011 Programacin Orientada a Objetos 30


Implementaciones de conjuntos
 Implementaciones de conjuntos:
 HashSet<T> guarda los elementos del conjunto
en una tabla hash.
 TreeSet<T> implementacin de conjuntos
ordenados basada en rboles binarios
balanceados.
 Implementa la interfaz SortedSet<T>

 Las operaciones de bsqueda y modificacin son


ms lentas en TreeSet que en HashSet

Curso 2010/2011 Programacin Orientada a Objetos 31


Mapas: Map<K,V> y SortedMap<K,V>
 La interfaz Map<K,V> define el tipo de datos que representa
pares <clave, valor>
 Un mapa no puede tener claves duplicadas.
 Cada clave slo puede tener un valor asociado.

 La interfaz SortedMap<K,V> extiende la interfaz Map<K,V>


para proporcionar la funcionalidad de mapas ordenados por
claves.
 Las operaciones son anlogas a las de la interfaz SortedSet
considerando el conjunto de claves.
 firstKey y lastKey: primera y ltima clave
 SortedMap<K,V> headSet (T toKey)
 SortedMap<K,V> tailSet (T fromKey)
 SortedMap<K,V> subSet (T fromKey ,T toKey)

Curso 2010/2011 Programacin Orientada a Objetos 32


Mapas: Map<K,V> y SortedMap<K,V>

 Un mapa no es una coleccin, sin embargo contiene


distintas colecciones:
 Conjunto de claves (Set<K>)
 Coleccin de valores (Collection<V>)
 Conjunto de pares <clave, valor> (Set<Map.Entry<K,V>>)

 Las implementaciones disponibles son:


 HashMap<T>: implementacin basada en una tabla hash
 TreeMap<T>: implementacin basada en rboles
balanceados.
 Las claves estn ordenadas (SortedSet<K>).

Curso 2010/2011 Programacin Orientada a Objetos 33


Interfaz Map<K,V>
 Mtodos bsicos:
 V put(K clave, V valor): inserta una asociacin en el
mapa.
 Retorna el valor de la antigua asociacin, si la hubiera.
 V get(clave): retorna el valor asociado a una clave.
 Si la asociacin no existe, devuelve nulo.
 Set<K> keySet(): devuelve el conjunto de claves.
 Collection<V> values(): devuelve la coleccin de valores.
 boolean containsKey(key): indica si existe una clave.
 Set<Map.Entry<K, V>> entrySet(): devuelve el conjunto
de todas las asociaciones, Map.Entry<K, V>:
 getKey(): consultar la clave.
 getValue(): consultar el valor.

Curso 2010/2011 Programacin Orientada a Objetos 34


Ejemplo clase Sucursal
public class Sucursal {
private int codigo;
private String direccion;
private HashMap<Persona,
LinkedList<ProductoFinanciero>> pasivo;

public Sucursal(int codigo, String direccion){


this.codigo = codigo;
this.direccion = direccion;
pasivo = new HashMap<Persona,
LinkedList<ProductoFinanciero>>();
}
public void addContrato(Persona cliente,
ProductoFinanciero producto) {
public Set<Persona> getClientes(){
public Set<ProductoFinanciero> getProductosContratados(){
}

Curso 2010/2011 Programacin Orientada a Objetos 35


Ejemplo clase Sucursal

public void addContrato(Persona cliente,


ProductoFinanciero producto)
{
LinkedList<ProductoFinanciero> productos;

if (! pasivo.containsKey(cliente)) {
productos = new LinkedList<ProductoFinanciero>();
pasivo.put(cliente, productos);
}
else productos = pasivo.get(cliente);

productos.add(producto);

Curso 2010/2011 Programacin Orientada a Objetos 36


Ejemplo clase Sucursal
public Set<Persona> getClientes(){
return new HashSet<Persona>(pasivo.keySet());
}

public Set<ProductoFinanciero> getProductosContratados(){


Collection<LinkedList<ProductoFinanciero>> productos;
productos = pasivo.values();
Set<ProductoFinanciero> cjtoProductos =
new HashSet<ProductoFinanciero>();

for (LinkedList<ProductoFinanciero> lista : productos)


cjtoProductos.addAll(lista);

return cjtoProductos;
}

Curso 2010/2011 Programacin Orientada a Objetos 37


Orden de los objetos
 El orden utilizado por las colecciones ordenadas
(SortedSet, SortedMap) puede ser el orden natural
de los objetos (por defecto) o el criterio de ordenacin
que se establece en el constructor.
 La interfaz Comparable impone el orden natural de los
objetos de las clases que la implementan.

public interface Comparable<T> {


public int compareTo(T o);
}

 El mtodo compareTo devuelve un entero positivo si la


relacin es mayor que, negativo si es menor que y cero
si son iguales.
Curso 2010/2011 Programacin Orientada a Objetos 38
Orden natural de Cuenta

public class Cuenta implements Comparable<Cuenta>{



public int compareTo(Cuenta otraCta) {
if (this.codigo > otraCta.codigo)

return 1;

else if (this.codigo < otraCta.codigo)

return -1;

else return 0;
}
}

Curso 2010/2011 Programacin Orientada a Objetos 39


TreeSet<Cuenta> orden natural
public class Persona {

private TreeSet<Cuenta> misCuentas;

public Persona(String dni, String nombre){



//TreeSet utiliza el orden natural de la clase Cuenta
misCuentas = new TreeSet<Cuenta>();
}

/**
* Aade una cuenta a la coleccin de la persona que es titular
* @param cta Cuenta a aadir en la coleccin
* @return true si la cuenta se ha aadido y false en caso contrario
*/
public boolean addCuenta(Cuenta cta){
return misCuentas.add(cta);
}
}

Curso 2010/2011 Programacin Orientada a Objetos 40


Criterios de ordenacin
 Para definir un criterio de ordenacin hay que
implementar la interfaz Comparator.

public interface Comparator<T> {


public int compare(T o1, T o2);
}

 El mtodo compare devuelve un entero positivo si la


relacin es mayor que, negativo si es menor que y
cero si son iguales.

Curso 2010/2011 Programacin Orientada a Objetos 41


Criterios de ordenacin para Cuenta
public class OrdenSaldo implements Comparator<Cuenta>{
public int compare(Cuenta o1, Cuenta o2) {
if (o1.getSaldo() > o2.getSaldo())
return 1;
else if (o1.getSaldo() < o2.getSaldo())
return -1;
else
return 0;
}
}

public class OrdenTitular implements Comparator<Cuenta>{


public int compare(Cuenta o1, Cuenta o2) {
return (o1.getTitular().getNombre().
compareTo(o1.getTitular().getNombre()));

}
}

Curso 2010/2011 Programacin Orientada a Objetos 42


TreeSet<Cuenta> con criterio de ordenacin

public class Persona {



private TreeSet<Cuenta> misCuentas;

public Persona(String dni, String nombre){



misCuentas = new TreeSet<Cuenta>(new OrdenTitular());

//TreeSet utiliza el orden establecido


//en la clase OrdenTitular para ordenar las cuentas
}

Curso 2010/2011 Programacin Orientada a Objetos 43


Iteradores
 Las colecciones de Java son iterables, es decir, podemos
recorrer todos sus elementos.
 Se utilizan iteradores para que el cdigo que realiza el
recorrido no conozca las particularidades de la estructura
de datos: lista enlazada, lista basada en arrays, etc.

public double posicionGlobal(List<Deposito> depositos) {


double posicion = 0;
for (Deposito deposito : depositos) {
posicion += deposito.getCapital();
}
return posicion;
}

Curso 2010/2011 Programacin Orientada a Objetos 44


Iteradores
 Java proporciona la interfaz Iterable<T> que debe ser
implementada por aquellas clases sobre las que se pueda
iterar:
public interface Iterable<T> {

Iterator<T> iterator();
}

 A los objetos iterables se les exige que creen objetos


iterador (Iterator) para realizar la iteracin.

 Los arrays y la interfaz Collection son iterables.

Curso 2010/2011 Programacin Orientada a Objetos 45


Iteradores
 Interfaz Iterator<T>:
 hasNext(): indica si quedan elementos en la iteracin.
 next(): devuelve el siguiente elemento de la iteracin.
 remove(): elimina el ltimo elemento devuelto por el iterador.

public interface Iterator<T> {

boolean hasNext();

T next();

void remove();
}

Curso 2010/2011 Programacin Orientada a Objetos 46


Recorrido for each
 El recorrido for each permite recorrer objetos iterables sin
manejar un objeto iterador.
 Es la opcin ms comn de recorrido.

public double posicionGlobal(List<Deposito> depositos) {


double posicion = 0;
for (Deposito deposito : depositos) {
posicion += deposito.getCapital();
}
return posicion;
}

Curso 2010/2011 Programacin Orientada a Objetos 47


Recorrido explcito con iterador
 Interesa manejar un iterador cuando queremos eliminar
algn elemento de la coleccin.
 En Java slo se puede modificar una coleccin que se est
recorriendo utilizando el iterador.

public double filtrar(List<Deposito> depositos) {


Iterator<Deposito> it = depositos.iterator();
while (it.hasNext()) {
Deposito deposito = iterator.next();
if (deposito.getCapital() < 1000)
it.remove();
}
}

Curso 2010/2011 Programacin Orientada a Objetos 48


Genericidad en C++
 La clases genricas en C++ se conocen como templates.
 Ejemplo: Contenedor

template <class T> class Contenedor{


private:
T contenido;
public:
T getContenido();
void setContenido (T elem);
};

Curso 2010/2011 Programacin Orientada a Objetos 49


Genericidad Implementacin
 La implementacin de la clase genrica debe realizarse en
el fichero de cabecera:

template<class T> T Contenedor<T>::getContenido(){


return contenido;
}

template<class T> void Contenedor<T>::setContenido(T elem){


contenido = elem;
}

Curso 2010/2011 Programacin Orientada a Objetos 50


Genericidad Uso
 Se indica el tipo de la clase genrica en su declaracin.
 Puede ser aplicada a tipos primitivos.

Persona* titular = new Persona("juan", "34914680");


Cuenta* cuenta = new Cuenta(titular);
Contenedor<Cuenta*> contenedor;
contenedor.setContenido(cuenta);
Cuenta* cta = contenedor.getContenido();
Contenedor<int> cEntero;
cEntero.setContenido(10);

Curso 2010/2011 Programacin Orientada a Objetos 51


Genericidad Crticas
 C++ no implementa un autntico sistema de
genericidad.

 Cuando se usa una clase genrica, se realiza un


reemplazo del texto del parmetro en la declaracin de la
clase.

 Por tanto, se genera cdigo para cada uno de los tipos


a los que se instancie la clase genrica.

Curso 2010/2011 Programacin Orientada a Objetos 52


Genericidad restringida
 No se puede restringir la genericidad.
 Est permitido aplicar cualquier mtodo y operador
sobre las entidades del tipo genrico (tipo T en el
ejemplo).
 Es problemtico determinar la sintaxis de los mensajes,
ya que se puede instanciar a tipos por valor o referencia.
 Si la operacin no est disponible sobre el tipo genrico, el
error ser detectado en tiempo de compilacin.

Curso 2010/2011 Programacin Orientada a Objetos 53


Colecciones en C++
 Todas las entidades de la Librera Estndar C++ se han
incluido en un nico espacio de nombres denominado
std.

 La librera estndar de plantillas, o STL (Standard


Template Library), implementa un conjunto de
estructuras de datos y algoritmos que conforman una
parte sustancial de la Librera Estndar C++.

 Las estructuras de datos genricas se denominan


contenedores.
 Los contenedores son clases genricas (template)
pensadas para contener cualquier tipo de objeto.

 No existe un contenedor comn raz de la jerarqua.


Curso 2010/2011 Programacin Orientada a Objetos 54
Tipos de colecciones
 Existen dos tipos de contenedores:
 Secuencias:
 Almacenan los elementos en orden secuencial.
 Adecuadas para accesos directos y secuenciales.
 vector, list, deque (cola de doble terminacin),
stack

 Asociaciones:
 Almacenan pares de valores <clave, valor>.
 Podra verse como una array en el que el ndice no tiene
por qu ser un entero.
 Adecuados para accesos aleatorios mediante claves.
 map, set

Curso 2010/2011 Programacin Orientada a Objetos 55


Cuenta.h
#include <list>
using namespace std;

class Cuenta {
public:

list<double>* getOperaciones() const;

private:

list<double>* operaciones;
void anotarOperacion(double cantidad);
};

Curso 2010/2011 Programacin Orientada a Objetos 56


Cuenta.cpp

Cuenta::Cuenta (Persona* persona, double saldoInicial){



operaciones = new list<double>();
}

list<double>* Cuenta::getOperaciones() const{


return new list<double>(*operaciones);
}

void Cuenta::anotarOperacion(double cantidad){


operaciones->push_back(cantidad);
}

Curso 2010/2011 Programacin Orientada a Objetos 57


Prueba de listas
int main () {

Cuenta* cuenta = new Cuenta(titular);
cuenta->ingreso(100);
cuenta->reintegro(300);
cuenta->ingreso(1000);
list<double>* movimientos;

movimientos = cuenta->getOperaciones();

list<double>::const_iterator it;
it = movimientos->begin();
for (; it != movimientos->end() ;++it)
cout << (*it) << endl;

exit(0);
}

Curso 2010/2011 Programacin Orientada a Objetos 58


Prueba de listas
 La implementacin de las listas no ofrece
mtodos para accesos aleatorios porque seran
ineficientes.

 Slo dispone de mtodos de acceso al principio y


al final
 Se puede utilizar de forma efectiva como una pila

 Para recorrer las listas se utilizan iteradores.

Curso 2010/2011 Programacin Orientada a Objetos 59


Prueba con vectores
int main () {

Cuenta* cuenta = new Cuenta(titular);
cuenta->ingreso(100);
cuenta->ingreso(300);
cuenta->reintegro(300);
cuenta->ingreso(1000);
vector<double>* movimientos;

movimientos = cuenta->getOperaciones();

for (int i = 0; i < movimientos->size(); i++)


cout << (*movimientos)[i] <<endl;

exit(0);
}
Curso 2010/2011 Programacin Orientada a Objetos 60
Prueba con vectores
 Los vectores se utilizan como arrays de tamao
fijo.

 Aunque tiene operaciones para aumentar el


tamao del vector se desaconseja su uso por ser
ineficientes.

 Acceso fcil y eficiente a los elementos.

 size() no devuelve el nmero de elementos


sino el tamao del vector.

Curso 2010/2011 Programacin Orientada a Objetos 61

Potrebbero piacerti anche