Professional Documents
Culture Documents
Plantillas II
1
So recarga
'e Operadores Creacin 'inmica de O !etos
Herencia(
Herencia M+ltiple
Polimor,ismo
#unciones *irtuales Polimor,ismo y So recarga(
Plantillas
Contenedores
Iteradores
23.1 Repaso
Programacin Orientada a Objeto:
#igura
Paralelogramo
Elipse
Rectngulo
)rapecio
C3rculo
23.1 Repaso
Plantillas de !"nciones # !"nciones $enricas % Templates 4as ,unciones gen0ricas son un mecanismo C++ 1ue permite de,inir una ,uncin mediante uno o 5arios parmetros .tipos gen0ricos/( $ partir de estas plantillas el compilador es capa6 de generar cdigo de ,unciones distintas 1ue comparten ciertas caracter3sticas( 4as ,unciones as3 generadas se denominan7 Instancias o especiali aciones de la plantilla( 4a plantilla representa un n&mero inde'inido de ,unciones( 'epende de cuntas Instancias creemos o utilicemos el compilador generar ms o menos cdigo(
template <class T> T maximo (T a, T b ) { .....}; //Instancias: int i1=1, i2=20, i3; i3 = maximo(i1,i2); float f1=10.03, f2=2.2, f3; f3 = maximo(f1,f2); Alumno a1(Pepe,8), a2(Ana,8); Alumno a3; a3 = maximo(a1,a2);
23.2 Plantillas
Mtodos $enricos )am i0n podemos utili6ar ,unciones gen0ricas como m0todos de clases(
// Declaracin o Prototipo (.h) class MiClase { public: template <class T> T maximo (T a, int b); .... private: .... .... } // Implementacin (.cpp) template <class Tipo> Myclase::maximo ( Tipo a, Tipo b ) { if (a<b) return b; return a; } // Uso (test.cpp) MiClase objeto; int max_int; float max_f, g = 3.3; max_int = objeto.maximo(5,5); max_f = objeto.maximo(g,88);
23.2 Plantillas
Plantillas de Clases o Clases $enricas Podemos de,inir clases mediante uno o 5arios parmetros 1ue :acen re,erencia a un tipo de dato( Podemos generar un montn de clases partiendo de un dise;o com+n( Partiendo de las mismas l3neas de cdigo genero muc:as y di,erentes clases( Otra 5e6 la reutili6acin con sus a:orros de es,uer6o y reduccin de e1ui5ocaciones( 4as clases generadas a partir de una plantilla se denominan Instancias o (speciali aciones de la plantilla( Como siempre< tratamos de resol5er o simpli,icar un pro lema(
23.2 Plantillas
Plantillas de Clases o Clases $enricas El pro lema a resol5er7
class Punto { private: int coorx ; int coory ; public: ... ... };
Puede ser necesario implementar esta clase de ,orma 1ue las coordenadas necesiten decimales( 4a opcin directa > y con muc:os incon5enientes > ya la conocemos7 Copiar y Pegar
?
23.2 Plantillas
Plantillas de Clases o Clases $enricas
class PuntoEntero { private: class PuntoLong int coorx ; {; int coory private: public: long int coorx ; ... long int coory ; ... class PuntoFloat public: }; { ... private: ... float coorx ; }; float coory ; public: ... ... }; template class <T> class Punto { private: T coorx ; T coory ; public: ... ... };
Con la Plantillas7 Podemos de,inir una clase genrica desde la 1ue crear (speciali aciones o Instancias para determinados tipos de dato o clases(
@
23.2 Plantillas
)inta*is template <class|typename <id>[,...]> class <identificador_de_plantilla> { // Declaracin de funciones // y datos miembro de la plantilla };
// Declaracin (.h) template class <T> class Punto { private: T coorx ; T coory ; public: Punto(int n); ~Punto(); }; // Implementacin (.cpp) template <class T> Punto<T>::Punto(int n) { coorx = n; coory = n; } // Uso (main.cpp) Punto <int> objeto_punto_ent(3); Punto <float> objeto_punto_flo(5); ......
23.2 Plantillas
Plantillas para Clases $enricas Representacin "M47
Punto
Punto<int>
4as ,unciones miem ro son a su 5e6 plantillas 1ue pueden utili6ar mismos parmetros 1ue la plantilla de la clase a la 1ue pertenecen(
template class <T> class Punto { private: T coorx_ ; T coory_ ; public: Punto(T a, T b); T coorx(); T coory(); void coorx(T c); void coory(T c); void mostrar(); }; // Implementacin (.cpp) template <class T> Punto<T>::Punto(T a, T b) { coorx = a; coory = b; } //----------------------------------template <class T> T Punto<T>::coorx() { return coorx; }
los
1B
23.2 Plantillas
Consideraciones para el dise+o de plantillas 'ise;ar primero para un tipo de datos en concreto7 Podemos pensar primero en clase Punto para enteros( Implementar primero la clase para el caso particular7 Codi,icar lo necesario para Punto con enteros( Con5ertirla en una clase gen0rica7 $;adimos la pala ra reser5ada %template& donde :aga ,alta y sustituimos tipos(
11
18
JCul es la salida por pantallaK JPor 1u0 no %,unciona&K 4a solucin pasa por crear nuestra propia clase cadena con un operador asignacin 1ue :aga lo correcto y con su constructor copia(
1=
1?
1@