You are on page 1of 15

Vigsimo segunda Sesin

Metodologas y Tcnicas de Programacin II

Programacin Orientada a Objeto (POO) C++

Plantillas I
1

Estado del Programa


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 O !etos en C++


"so y aplicacin Constructores Constantes e %inline&

#unciones $migas So recarga de #unciones

So recarga
'e Operadores Creacin 'inmica de O !etos

Herencia(

)ipos de *isi ilidad

Herencia M+ltiple

Polimor,ismo
#unciones *irtuales Polimor,ismo y So recarga(

Plantillas

Contenedores

Iteradores

22.1 Repaso
Programacin Orientada a Objeto: .uscamos resolver roblemas/

)enemos unos datos de partida( $plicamos unos algoritmos( O tenemos un resultado(


0ueremos/

Optimi1ar nuestro es,uer1o( "tili1ar lo 2ue 3an 3ec3o otros o nosotros mismos( 0ue sea e,iciente( Hacer nuestro cdigo los ms gen4rico posi le(

22.1 Repaso
Programacin Orientada a Objeto:

$ straccin de 'atos Herencia Polimor,ismo

intar() area() des la!ar()

#igura

Paralelogramo

Elipse

Rectngulo

)rapecio

C9rculo

So recarga 6'e ,unciones y de Operadores7


Posi ilidad de declarar m4todos con el mismo nom re 2ue pueden tener di,erentes argumentos dentro de una misma clase(
8

22.2 Plantillas de Funciones (Templates)


"aciendo n#estro cdigo genrico: :os 3emos encontrado en situaciones donde ;emos claramente 2ue lo desea le es 2ue #na o eracin 6una ,uncin< un m4todo7 sea ;lida con di$erentes ti os de datos( So recargando ,unciones y operadores/ =a suma para enteros( =a suma para n+meros comple!os( =a suma para $lumnos( "tili1ando el polimor,imo/ Con un puntero a una clase ase y una !erar2u9a pod9amos %tocar>una>nota67& para/ Clarinete(((( ?uitarra(((( %a sobrecarga tiene #n inconveniente: Tengo &#e de$inir tantas $#nciones como ti os de datos 'aya
@

22.2 Plantillas de Funciones (Templates)


Plantillas =as Plantillas nos permiten de,inir ,unciones gen4ricas( Mayor reutili1acin de cdigo(
EL PROBLEMA int maximo(int a, int b ) { if (a<b) return b; return a; } float maximo(float a, float b ) { if (a<b) return b; return a; }

Repetimos el cdigo de la ,uncin/ Reutili1acin de %copiaApega& $plicamos so recarga de ,unciones( Pro lemas/ Posi ilidad de errores( Replicacin de pro lemas( Cdigo 2ue no est centrali1ado( BSi 2ueremos el mCimo para doublesD
E

22.2 Plantillas de Funciones


Plantillas de (#nciones
int maximo(int a, int b ) { if (a<b) return b; return a; } float maximo(float a, float b ) { if (a<b) return b; return a; } template <class UnTipo> UnTipo maximo (UnTipo a, UnTipo b) { if (a<b) return b; return a; }

=as ,unciones maCimo67 tienen el mismo cuerpo( Se di,erencian en los prototipos< en la declaracin( Claro eso es por2ue los tipos de los argumentos son di,erentes( Parece interesante y +til/ %)ener una ,uncin gen4rica capa1 de calcular el mCimo de dos ;alores de cual2uier tipo(& C++ nos permite esto mismo de,iniendo ,unciones gen4ricas 6para cual2uier tipo7 mediante el uso de Plantillas A Templates(
F

22.2 Plantillas de Funciones


(#nciones genricas #tili!ando lantillas) "na ,uncin gen4rica de,ine un con!unto de operaciones 2ue se aplicarn a di,erentes tipos de datos( "na plantilla de ,unciones es como #n atrn( "na plantilla es eci$ica #n conj#nto in$inito de $#nciones 2ue pueden ser aplicadas a distintos tipos de datos( "na plantilla descri e las ro iedades genricas de una ,uncin(
template <class UNTIPO> UNTIPO maximo ( UNTIPO a, UNTIPO b ) { if (a<b) return b; return a; } ... int a=5, int b=8, c; float d=3.0, e=5.1, f; c=maximo(a,b); f=maximo(d,e); ...

22.2 Plantillas de Funciones


Plantillas de (#nciones: template <class <id>[,...]> <tipo_retorno> <identificador>(<lista_de_parmetros>) { // Declaracin de funcin }; =a pala ra reser;ada tem late indica 2ue se ;a a declarar una plantilla( Se declaran en un arc3i;o de ca ecera 6(37( Se puede poner cual2uier tipo sea clase o no 6enteros< c3ar<(((7
template <class TIPO1> TIPO1 funcion ( TIPO1 a) { // cuerpo de la funcin. } template <class TIPO1> TIPO2 funcion ( int cont, TIPO1 a) { // cuerpo de la funcin. } } } template <class TIPO1, class TIPO2 > TIPO2 funcion ( TIPO1 a, TIPO2 b) { // cuerpo de la funcin. template <class TIPO1> TIPO1 funcion ( TIPO1 a, TIPO1 b) { // cuerpo de la funcin.

22.2 Plantillas de Funciones


Plantillas de (#nciones "na ,uncin gen4rica de,ine un con!unto ilimitado de ,unciones so recargadas( =as plantillas no generan cdigo directamente( El cdigo lo genera el compilador en el punto 2ue ;e 2ue se utili1a una plantilla( Se siguen las normas de la so recarga( Slo se mira la lista de pametros no el retorno( =os tipos tienen 2ue aparecer al menos una ;e1 en la lista de argumentos de la ,uncin(
template <class UNTIPO> UNTIPO maximo ( int a, float b ) { ..... } // ERROR POR QU?

1I

22.2 Plantillas de Funciones


*obrecarga de Plantillas de (#nciones BPuedo de,inir ;aria ;eces y con el mismo nom re una ,uncin gen4ricaD SJ< aplico las mismas normas de la so recarga de ,unciones %normales&( "tili1amos/ 'IS)I:)O :KMERO L/O )IPO 'E $R?"ME:)OS(
template <class T> T maximo (T a, T b ) { .....}; template <class T> T maximo (T a, T b, T c ) { .....}; template <class T> T maximo (T arr[], int size ) { .....}; template <class T> T maximo (int A, int size ) //?? { .....};

int main() { char c[5]={5, 6, 3, 2, 0}; int a; float b; double m; a = maximo(5,10); b = maximo(4.5, 5.0, 9.0); m = maximo(c, 5); }

11

22.2 Plantillas de Funciones


+s eciali!ando (#nciones ,enricas template <class T> Se puede de,inir una ,uncin %normal& UnTipo maximo (T a, T b) 2ue pre;ale1ca so re la de,inicin de { la plantilla(
if (a<b) return b; return a; } // Funcion maximo() especializada char * maximo ( char* s1, char* s2 ) { if (strcmp(s1,s2)>0) { return s1; } return s2; }

=a plantilla 3ace lo correcto con tipos de datos tales como enteros< reales<((( :o 3ace lo esperado con cadenas( BPor 2u4D B#unciona nuestra plantilla con la clase $lumnoD =e ,alta algo< BnoD BEl 2u4D

1-

22.2 Plantillas de Funciones


+s eciali!acin de (#nciones ,enricas Reglas para encontrar la ,uncin so recargada correcta/ Se usca coincidencia eCacta de ,unciones( BHay alguna ,uncin espec9,ica 2ue coincida en nom re y en n+mero< tipo y orden de los argumentosD Se usca alguna plantilla de ,uncin 2ue coincida en nom re y argumentos( =as reglas utili1adas son las de la so recarga %normal&( Si no 3ay coincidencia se genera error(

15

22.3 Ejemplo de Plantillas de Funciones


Plantilla de (#nciones en accin Supongamos 2ue nos piden 2ue codi,i2uemos una ,uncin 2ue de;uel;a el ;alor mCimo de los elementos de un array de enteros(
int max_array (int arr[ ] ,int tam ) { int aux; aux = arr[0]; for (int i =0; i<tam; i++) { if ( arr[i]>aux ) aux = arr[i]; } return aux; }

$3ora nos dicen 2ue necesitan otra ,uncin para arrays de %long int&( "samos la so recarga/ A Ellos 3acen la llamada igual( A :osotros %copiarApegar&

long int max_array (long int arr[ ] ,int tam ) { long int aux; aux = arr[0]; for (int i =0; i<tam; i++) { if ( arr[i]>aux ) aux = arr[i]; } return aux; } 18

22.3 Ejemplo de Plantillas de Funciones


Plantilla de (#nciones en accin Sa emos 2ue nos ;an pedir otra ,uncin pero para reales M float, por2ue ;an a 2uerer notas con decimales( $dems nos damos cuenta de 2ue se puede optimi1ar 6empe1amos en la posicin 1 del array en lugar de en la I7 y no 2ueremos ir tocando cdigo en 2uince sitios di,erentes(
long int max_array (long int arr[ ] ,int tam ) { long int aux; aux = arr[0]; for (int i =0; i<tam; i++) { if ( arr[i]>aux ) aux = arr[i]; } return aux; } int main() { int arr_i[5]={1,7,3,5,2}; float arr_f[4]={1.2,2.3,7.5,0.3}; char arr_c[]={'a','x','z',b'}; cout << maximo int: << max_array(arr_i,5) << endl; cout << maximo float: << max_array(arr_f,5) << endl; cout << maximo char: << max_array(arr_c,4) << endl;

1.- Implementar max_array usando una funcin genrica. 2.- Hacer que sirva tambin para cadenas (char*)

1@

You might also like