1 / 29

Plantillas

Plantillas. Tecnología de la Programación Javier Nieves Acedo. Si no queremos empezar la casa por el tejado. Hay que plantar unas buenas bases. Así que antes de la…. Hay que empezar con las plantillas …. Problema de Partida (1). En un proyecto… int Max( int a, int b) {

galen
Download Presentation

Plantillas

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Plantillas Tecnología de la Programación Javier Nieves Acedo

  2. Si no queremos empezar la casa por el tejado

  3. Hay que plantar unas buenas bases

  4. Así que antesde la…

  5. Hay que empezar con las plantillas …

  6. Problema de Partida (1) • En un proyecto… int Max(int a, int b) { return a > b ? a: b; } voidmain() { int i1, i2, iMayor; iMayor = Max(i1, i2); }

  7. Problema de Partida (2) • Y si quiero hacer esto… voidmain() { int i1, i2, iMayor; float f1, f2, fMayor; char c1, c2, cMayor; iMayor = Max(i1, i2); fMayor = Max(f1, f2); cMayor = Max(c1, c2); } ERROR

  8. Problema de Partida (3) • Primera solución: Sobrecarga int Max(int a, int b) { return a > b ? a: b; } float Max(float a, float b) { return a > b ? a: b; } char Max(char a, char b) { return a > b ? a: b; }

  9. Problema de Partida (4) • Segunda solución: Macros #define MAX(a, b) (a) > (b) ? (a) : (b) No da Error pero no se comprueban los tipos de los datos

  10. Problema de Partida (y4) • Tercera solución: Plantillas

  11. Entremos de lleno con los tipos genéricos …

  12. Tipos Genéricos (1) • Plantillas == 3ª forma de Polimorfismo • A función de una plantilla es… • Escribir código genérico • Generar posteriormente funciones o clases • También se llaman tipos parametrizados

  13. Tipos Genéricos (y 2) • Cuando utilizarlas… • Haya que definir diferentes pero muy similares funciones o clases. • Hay dos tipos: • Plantillas de Funciones • Plantillas de Clases

  14. Y para programarlo…

  15. Plantillas Generadoras de Funciones (1) • Sintaxis: template <class P> función • Template es palabra reservada • <> lista de identificadores precedidos de class (no OO) y separados por comas (‘,’) • Los identificadores son parámetros de sustitución

  16. Plantillas Generadoras de Funciones (2) • Solución al problema de partida (1): template <class IDENT> IDENT Max(IDENT a, IDENT b) { return a > b ? a : b; }

  17. Plantillas Generadoras de Funciones (y 3) • Solución al problema de partida (y 2): intMax(int, int); floatMax(float, float); charMax(char, char); voidmain() { int i1, i2, iMayor; float f1, f2, fMayor; char c1, c2, cMayor; iMayor = Max(i1, i2); fMayor = Max(f1, f2); cMayor = Max(c1, c2); }

  18. Plantillas Generadoras de Clases (1) • Usan una sintaxis similar a las de funciones. • Con ellas se pueden generar más de una clase con tipos diferentes. • Uso más frecuente • Contenedores (por ejemplo STL)

  19. Plantillas Generadoras de Clases (2) • Ejemplo (1): constint TRUE = 1; constint FALSE = 0; template <class TIPO> class Pila { private: TIPO * P; intCim; intMaxLong;

  20. Plantillas Generadoras de Clases (2) • Ejemplo (2): public: Pila(intTam = 1000) : MaxLong(Tam) { P = new TIPO[Tam]; Cim = -1; } ~Pila() {delete [] P;} voidPush(TIPO El) {P[++Cim] = El;} TIPO Pop() {return(P[Cim--]);} TIPO Cima() {return(P[Cim]);} intVacia() {return((Cim == -1 ? 1: 0));} int Llena() {return((Cim == MaxLong-1)?0: 1);} };

  21. Plantillas Generadoras de Clases (y 3) • Ejemplo (y 3): voidmain() { Pila<int> PilaInt(10); Pila<char> PilaChar(15); for (int i=65; i <= 95; i += 5) { cout << "Poniendo en pila 1 ... " << i; cout << "y en pila 2..." << char(i) <<"\n"; PilaInt.Push(i); PilaChar.Push(char(i)); } }

  22. Plantillas con Varios Parámetros de Sustitución (1) template <class T, int CONSTANTE> class Suma { T x; public: Suma(T a):x(a){} Suma(void){} voidIniSuma(T a){ x=(T) a;} T Sumar(T a) {T w = CONSTANTE; returna+w+x;} }; Suma <int, 1> SI

  23. Plantillas con Varios Parámetros de Sustitución (y 2) template <class T, class U, int CONSTANTE> class Suma { T x; U y; public: Suma(T a=0, U b=0):x(a),y(b){} voidIniSuma(T a, U b){ x=(T)a; y =(U)b; } int sumar(U b) { T w = CONSTANTE; returnint(w+x)+int(y)+U(b); } }; Suma <int, int, 1> SI

  24. Pero en memoria qué sucede…

  25. Uso de Memoria • Las plantillas son una declaración (van en el .h) • El compilador crea el código para cada plantilla. • Beneficio: optimizada para cada tipo • Inconveniente: tamaño del programa crece (ocupa más memoria pero sin afectar al rendimiento)

  26. Ahora te toca a ti

  27. Ejercicio • Plantilla para una clase Vector de tipo genérico. • Con un array y su tamaño (gestionará su propia memoria). • Métodos: • Constructores (defecto, copia). • Operador de asignación • Recoger el tamaño, recoger un elemento, añadir un elemento al final, eliminar un elemento por posición.

  28. La STL se va a utilizar igual

  29. Plantillas Tecnología de la Programación Javier Nieves Acedo

More Related