Вы находитесь на странице: 1из 15

VigsimosegundaSesin

Metodologas y Tcnicas de Programacin II

Programacin Orientada a Objeto (POO) C++

Plantillas I
1

EstadodelPrograma
Introduccin a la POO Repaso de Conceptos
Historia de la Programacin Conceptos de POO Estndares de Programacin Punteros y Memoria C++ Mi primera Clase E/S Control y Operadores

Clases y Objetos en C++


Uso y aplicacin Constructores Constantes e inline

Funciones Amigas Sobrecarga de Funciones

Sobrecarga
De Operadores Creacin Dinmica de Objetos

Herencia.

Tipos de Visibilidad

Herencia Mltiple

Polimorfismo
Funciones Virtuales Polimorfismo y Sobrecarga.

Plantillas

Contenedores

Iteradores

22.1Repaso
Programacin Orientada a Objeto: Buscamos resolver problemas:

Tenemos unos datos de partida. Aplicamos unos algoritmos. Obtenemos un resultado.


Queremos:

Optimizar nuestro esfuerzo. Utilizar lo que han hecho otros o nosotros mismos. Que sea eficiente. Hacer nuestro cdigo los ms genrico posible.

22.1Repaso
Programacin Orientada a Objeto:

Abstraccin de Datos Herencia Polimorfismo

pintar() area() desplazar()

Figura

Paralelogramo

Elipse

Rectngulo

Trapecio

Crculo

Sobrecarga (De funciones y de Operadores)


Posibilidad de declarar mtodos con el mismo nombre que pueden tener diferentes argumentos dentro de una misma clase.
4

22.2PlantillasdeFunciones(Templates)
Haciendo nuestro cdigo genrico: Nos hemos encontrado en situaciones donde vemos claramente que lo deseable es que una operacin (una funcin, un mtodo) sea vlida con diferentes tipos de datos. Sobrecargando funciones y operadores: La suma para enteros. La suma para nmeros complejos. La suma para Alumnos. Utilizando el polimorfimo: Con un puntero a una clase base y una jerarqua podamos tocar_una_nota() para: Clarinete.... Guitarra.... La sobrecarga tiene un inconveniente: Tengo que definir tantas funciones como tipos de datos haya
5

22.2PlantillasdeFunciones(Templates)
Plantillas Las Plantillas nos permiten definir funciones genricas. Mayor reutilizacin de cdigo.
ELPROBLEMA intmaximo(inta,intb) { if(a<b) returnb; returna; } floatmaximo(floata,floatb) { if(a<b) returnb; returna; }

Repetimos el cdigo de la funcin: Reutilizacin de copia-pega Aplicamos sobrecarga de funciones. Problemas: Posibilidad de errores. Replicacin de problemas. Cdigo que no est centralizado. Si queremos el mximo para doubles?
6

22.2PlantillasdeFunciones
Plantillas de Funciones
intmaximo(inta,intb) { if(a<b) returnb; returna; } floatmaximo(floata,floatb) { if(a<b) returnb; returna; } template<classUnTipo> UnTipomaximo(UnTipoa,UnTipob) { if(a<b) returnb; returna; }

Las funciones maximo() tienen el mismo cuerpo. Se diferencian en los prototipos, en la declaracin. Claro eso es porque los tipos de los argumentos son diferentes. Parece interesante y til: Tener una funcin genrica capaz de calcular el mximo de dos valores de cualquier tipo. C++ nos permite esto mismo definiendo funciones genricas (para cualquier tipo) mediante el uso de Plantillas - Templates.
7

22.2PlantillasdeFunciones
Funciones genricas utilizando plantillas. Una funcin genrica define un conjunto de operaciones que se aplicarn a diferentes tipos de datos. Una plantilla de funciones es como un patrn. Una plantilla especifica un conjunto infinito de funciones que pueden ser aplicadas a distintos tipos de datos. Una plantilla describe las propiedades genricas de una funcin.
template<classUNTIPO> UNTIPOmaximo(UNTIPOa,UNTIPOb) { if(a<b) returnb; returna; } ... inta=5,intb=8,c; floatd=3.0,e=5.1,f; c=maximo(a,b); f=maximo(d,e); ...

22.2PlantillasdeFunciones
Plantillas de Funciones: template<class<id>[,...]> <tipo_retorno><identificador>(<lista_de_parmetros>) { //Declaracindefuncin }; La palabra reservada template indica que se va a declarar una plantilla. Se declaran en un archivo de cabecera (.h). Se puede poner cualquier tipo sea clase o no (enteros, char,...)
template<classTIPO1> TIPO1funcion(TIPO1a) { //cuerpodelafuncin. } template<classTIPO1> TIPO2funcion(intcont,TIPO1a) { //cuerpodelafuncin. } template<classTIPO1> TIPO1funcion(TIPO1a,TIPO1b) { //cuerpodelafuncin. } template<classTIPO1,classTIPO2> TIPO2funcion(TIPO1a,TIPO2b) { //cuerpodelafuncin. }

22.2PlantillasdeFunciones
Plantillas de Funciones Una funcin genrica define un conjunto ilimitado de funciones sobrecargadas. Las plantillas no generan cdigo directamente. El cdigo lo genera el compilador en el punto que ve que se utiliza una plantilla. Se siguen las normas de la sobrecarga. Slo se mira la lista de pametros no el retorno. Los tipos tienen que aparecer al menos una vez en la lista de argumentos de la funcin.
template<classUNTIPO> UNTIPOmaximo(inta,floatb)//ERRORPORQU? { ..... }

10

22.2PlantillasdeFunciones
Sobrecarga de Plantillas de Funciones Puedo definir varia veces y con el mismo nombre una funcin genrica? S, aplico las mismas normas de la sobrecarga de funciones normales. Utilizamos: DISTINTO NMERO Y/O TIPO DE ARGUMENTOS.
template<classT> Tmaximo(Ta,Tb) {.....}; template<classT> Tmaximo(Ta,Tb,Tc) {.....}; template<classT> Tmaximo(Tarr[],intsize) {.....}; template<classT> Tmaximo(intA,intsize)//?? {.....};

intmain() { charc[5]={5,6,3,2,0}; inta;floatb; doublem; a=maximo(5,10); b=maximo(4.5,5.0,9.0); m=maximo(c,5); }

11

22.2PlantillasdeFunciones
Especializando Funciones Genricas template<classT> Se puede definir una funcin normal UnTipomaximo(Ta,Tb) que prevalezca sobre la definicin de { la plantilla.
if(a<b) returnb; returna; } //Funcionmaximo()especializada char*maximo(char*s1,char*s2) { if(strcmp(s1,s2)>0) { returns1; } returns2; }

La plantilla hace lo correcto con tipos de datos tales como enteros, reales,... No hace lo esperado con cadenas. Por qu? Funciona nuestra plantilla con la clase Alumno? Le falta algo, no? El qu?

12

22.2PlantillasdeFunciones
Especializacin de Funciones Genricas Reglas para encontrar la funcin sobrecargada correcta: Se busca coincidencia exacta de funciones. Hay alguna funcin especfica que coincida en nombre y en nmero, tipo y orden de los argumentos? Se busca alguna plantilla de funcin que coincida en nombre y argumentos. Las reglas utilizadas son las de la sobrecarga normal. Si no hay coincidencia se genera error.

13

22.3EjemplodePlantillasdeFunciones
Plantilla de Funciones en accin Supongamos que nos piden que codifiquemos una funcin que devuelva el valor mximo de los elementos de un array de enteros.
intmax_array(intarr[],inttam) { intaux; aux=arr[0]; for(inti=0;i<tam;i++) { if(arr[i]>aux) aux=arr[i]; } returnaux; }

Ahora nos dicen que necesitan otra funcin para arrays de long int. Usamos la sobrecarga: - Ellos hacen la llamada igual. - Nosotros copiar-pegar

longintmax_array(longintarr[] ,inttam) { longintaux; aux=arr[0]; for(inti=0;i<tam;i++) { if(arr[i]>aux) aux=arr[i]; } returnaux; } 14

22.3EjemplodePlantillasdeFunciones
Plantilla de Funciones en accin Sabemos que nos van pedir otra funcin pero para reales float, porque van a querer notas con decimales. Adems nos damos cuenta de que se puede optimizar (empezamos en la posicin 1 del array en lugar de en la 0) y no queremos ir tocando cdigo en quince sitios diferentes.
longintmax_array(longintarr[] ,inttam) { longintaux; aux=arr[0]; for(inti=0;i<tam;i++) { if(arr[i]>aux) aux=arr[i]; } returnaux; } intmain() { intarr_i[5]={1,7,3,5,2}; floatarr_f[4]={1.2,2.3,7.5,0.3}; chararr_c[]={'a','x','z',b'}; cout<<maximoint:<< max_array(arr_i,5)<<endl; cout<<maximofloat:<< max_array(arr_f,5)<<endl; cout<<maximochar:<< max_array(arr_c,4)<<endl; }

1.Implementarmax_arrayusandounafuncingenrica. 2.Hacerquesirvatambinparacadenas(char*)

15

Вам также может понравиться