5 Mecanismos Reuntilizacion Abstraccion Cont

29
Mecanismos para la Reutilización y Abstracción del Código -2a parte Apoyo SSD5

Transcript of 5 Mecanismos Reuntilizacion Abstraccion Cont

Page 1: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mecanismos para la Reutilización y Abstracción del Código -2a

parte

Apoyo SSD5

Page 2: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mtl. Lourdes Cahuich 2

Objetivo

• Este módulo del curso presenta los mecanismos disponibles que facilitan la reutilización y abstracción del código en el lenguaje C++.

Page 3: 5 Mecanismos Reuntilizacion Abstraccion Cont

5.3 Plantillas (Templates)

Page 4: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mtl. Lourdes Cahuich 4

Plantillas de Funciones

• Las plantillas de funciones permiten que un programador aplique la lógica de una función a más de un tipo de dato.

• Una declaración ordinaria de una función de C++ dicta los tipos de datos de sus parámetros

Page 5: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mtl. Lourdes Cahuich 5

Plantillas de Funciones

• Hay situaciones, sin embargo, cuando la estructura lógica de una función tiene sentido para muchos tipos diferentes.

• Por ejemplo, para computar el máximo de dos valores, realizamos el mismo tipo de cálculo sin importar si los valores son enteros o cadenas de caracteres.

Page 6: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mtl. Lourdes Cahuich 6

Plantillas de Funciones

• Las plantillas de funciones permiten que el programador cree las funciones independientes de los tipos de datos de sus parámetros.

Page 7: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mtl. Lourdes Cahuich 7

Plantillas de Funciones

• Usando una plantilla de función, un programador de C++ crea la lógica de una función alrededor de un tipo de datos genérico.

• El compilador luego crea versiones de la función para tipos de datos específicos

Page 8: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mtl. Lourdes Cahuich 8

template <class T>

T my_max(T x, T y) {

return x < y ? y : x;

}

Page 9: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mtl. Lourdes Cahuich 9

Plantillas de Funciones

• Las plantillas de funciones requieren una sintaxis nueva y única.

• En la línea 1 del listado anterior, la palabra reservada template especifica que la función es una plantilla de función.

Page 10: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mtl. Lourdes Cahuich 10

Plantillas de Funciones

• Es seguido por la palabra reservada class en <> y un tipo de dato genérico llamado T.

• El tipo de dato genérico llamado T se utiliza a través de la implantación de la función max.

Page 11: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mtl. Lourdes Cahuich 11

Plantillas de Funciones

• El compilador sustituye este nombre del tipo de dato genérico con los tipos de datos específicos usados por el programa

• En lugar de la palabra reservada class, C++ también acepta la palabra reservada typename.

Page 12: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mtl. Lourdes Cahuich 12

Plantillas de Funciones

• Para evitar confusiones, este curso usará la palabra reservada class al definir plantillas.

Page 13: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mtl. Lourdes Cahuich 13

#include <iostream>#include <cstdlib>#include <string>using namespace std;template <class T>const T& my_max(const T& x, const T& y) {

return x < y ? y : x;}int main(int argc, char* argv[]) {

int i1 = 1;int i2 = 2;cout << "Maximum is: " << my_max(i1, i2) << endl;float f1 = 34.4;float f2 = 24.2;cout << "Maximum is: " << my_max(f1, f2) << endl;string s1 = "test1";string s2 = "test2";cout << "Maximum is: " << my_max(s1, s2) << endl;return EXIT_SUCCESS;

}

Page 14: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mtl. Lourdes Cahuich 14

Plantillas de Funciones

• Nos referimos a una plantilla de función como "plantilla" porque el compilador realmente crea múltiples versiones de la función basada en la definición genérica de la "plantilla".

Page 15: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mtl. Lourdes Cahuich 15

Plantillas de Funciones

• Para saber qué versiones se necesita crear, el compilador busca en el código fuente de un programa, examinando los tipos de datos de los parámetros reales pasados a la función modelo.

Page 16: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mtl. Lourdes Cahuich 16

Plantillas de Funciones

• Al definir y usar las plantillas de funciones, un programador debe considerar que los tipos de datos reales provistos a una plantilla de función deben soportar a los operadores y a los miembros de los datos usados con el tipo de datos genérico

Page 17: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mtl. Lourdes Cahuich 17

Plantillas de Funciones

• Las plantillas de funciones pueden utilizar más de un tipo de dato genérico.

• El siguiente listado muestra una plantilla de función some_function, que tiene dos tipos genéricos.

Page 18: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mtl. Lourdes Cahuich 18

• Esta función toma dos parámetros.

• El primer parámetro es del tipo genérico X y el segundo es del tipo genérico Y.

#include <iostream>

#include <string>

using namespace std;

template <class X, class Y>

void output(X x, Y y) {

cout << x << " " << y << endl;

}

Page 19: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mtl. Lourdes Cahuich 19

Plantillas de Clases

• Además de las plantillas de funciones, los programadores pueden utilizar C++ para crear plantillas de clases.

• Una plantilla de clase en C++ es una clase cuya definición es independiente de un tipo de datos específico.

Page 20: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mtl. Lourdes Cahuich 20

Plantillas de Clases

• Por ejemplo, podríamos definir una plantilla de clase Array que trabaja para enteros, valores de punto flotante, caracteres, cadenas de caracteres, y clases definidas por el usuario.

Page 21: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mtl. Lourdes Cahuich 21

Plantillas de Clases

• La sintaxis involucrada en una definición de la plantilla de clase es similar a la de una plantilla de función.

Page 22: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mtl. Lourdes Cahuich 22

template <class ElementType>class Array {private:

ElementType arr[SIZE]; // fixed size arraypublic:

// ConstructorArray(ElementType e) {

for (int i = 0; i < SIZE; i++) {arr[i] = e;

}}// Element accessElementType& operator[](int i) {

assert (0 <= i && i < SIZE);return arr[i];

}};

Page 23: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mtl. Lourdes Cahuich 23

Plantillas de Clases

• Una línea que contiene la palabra reservada template y una lista de los nombres de los tipos de datos genéricos precede la definición

Page 24: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mtl. Lourdes Cahuich 24

Plantillas de Clases

• El siguiente listado muestra la instancia de las plantillas de clases.

• Se denota el tipo específico de la clase genérica dentro de los caracteres <>

Array<int> i(10);

Array<float> f(22.5);

Array<string> s("initial value");

Page 25: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mtl. Lourdes Cahuich 25

Plantillas de Clases

• La palabra reservada template debe preceder cualquier definición de la función miembro que aparece fuera de la definición de clase

Page 26: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mtl. Lourdes Cahuich 26

template <class ElementType>class Array {private:

ElementType arr[SIZE]; // fixed size arraypublic:

Array(ElementType e);ElementType& operator[](int i);

};template <class ElementType>Array<ElementType>::Array(ElementType e) {

for (int i = 0; i < SIZE; i++) { arr[i] = e;

}}template <class ElementType>ElementType& Array<ElementType>::operator[](int i) {

assert (0 <= i < SIZE);return arr[i];

}

Page 27: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mtl. Lourdes Cahuich 27

Plantillas de Clases

• La sintaxis que define las funciones miembro de las plantilla de clase puede ser poco manejable.

• Esto es especialmente cierto en plantillas de clases que tienen muchos parámetros de tipos.

Page 28: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mtl. Lourdes Cahuich 28

Plantillas de Clases

• Una manera de aliviar esta complejidad es el utilizar nombres simples para los parámetros de la plantilla.

• Para dar legibilidad dentro de las definiciones de las funciones miembros, defina tipos descriptivos para los nombres simples de los parámetros

Page 29: 5 Mecanismos Reuntilizacion Abstraccion Cont

Mtl. Lourdes Cahuich 29

template <class ET, class CT, class TT, class IT>

class Automobile {protected:

// more human readable names typedef ET EngineType;

typedef CT ChassisType;typedef TT TireType;typedef IT InteriorType;

protected:EngineType engine;ChassisType chassis;TireType tires[4];InteriorType interior;

public:Automobile(void);

};