5 mecanismos reuntilizacion abstraccion cont

Post on 04-Jul-2015

943 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

parte

Apoyo SSD5

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++.

5.3 Plantillas (Templates)

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

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.

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.

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

Mtl. Lourdes Cahuich 8

template <class T>

T my_max(T x, T y) {

return x < y ? y : x;

}

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.

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.

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.

Mtl. Lourdes Cahuich 12

Plantillas de Funciones

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

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;

}

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".

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.

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

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.

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;

}

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.

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.

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.

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];

}};

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

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");

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

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];

}

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.

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

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);

};

top related