Conocer los tipos de plantillas Utilizar las plantillas de clase para resolver problemas Aplicar el concepto de genericidad utilizado en la POO
Computadora con el software DevC++. Gua Nmero 11.
El lenguaje de programacin C++ ofrece otro recurso para ganar generalidad en la definicin de soluciones: las plantillas. Estas permiten declarar funciones o clases dejando sin especificar el tipo de algunos de sus parmetros y/o datos (en el caso de funciones) o el tipo de algunos de sus miembros (en el caso de las clases). A continuacin se analizarn detalladamente las plantillas de funciones y las plantillas de clases.
Plantillas de funciones. Una plantilla de funcin es un modelo de funcin que el compilador de C++ usar para construir diferentes versiones de una misma funcin, segn los tipos de datos que se especifiquen al invocar la misma. La plantilla permite escribir funciones que difieren exclusivamente en el tipo de datos que manejan. Para definir una plantilla de funcin se utiliza la siguiente sintaxis: template <class T1, class T2,, class Tn>; donde: template = palabra reservada Facultad: Ingeniera Escuela: Computacin Asignatura: Programacin II Objetivos Especficos Materiales y Equipo Introduccin Terica Programacin II, Gua 11 2 Ti = Tipo de dato genrico El uso de plantillas de funciones es generalizado a diferentes tipos de datos. La sobrecarga de funciones obtiene el mismo efecto, pero usando ms cdigo.
Plantillas de clases. Las plantillas de clases permiten definir versiones de una misma clase que difieren en el tipo de dato de algunos de sus miembros. Es decir, se crea el modelo de una clase el cual permitir definir distintas instancias de la misma para diferentes tipos de datos. Para declarar una plantilla de clase se usan las palabras reservadas template y class T. El tipo T se usa en aquellos miembros de la clase cuyos tipos tomarn un valor en el momento de crear los objetos A continuacin se muestra la sintaxis que se utiliza para definir una plantilla de clase: template <class T> class <Nombre de la Plantilla de clase> { private: T Atributo; // datos miembros de la clase public: PlantillaClase( ); T Metodo1 ( ); void Metodo2 (T valor); // funciones miembros de la clase
};
Para declarar un objeto, a partir de una plantilla de clase, se aplica la siguiente sintaxis: PlantillaClase <tipo > Nombre del objeto; donde tipo indica el tipo de dato que reemplazar todas las ocurrencias de T en la definicin de la clase. Por ejemplo, si quisiera declarar dos objetos de tipo PlantillaClase, pero uno con el tipo int como tipo de dato, y otro con float, entonces haramos lo siguiente: PlantillaClase <int> Objeto1: PlantillaClase <float> Objeto2:
Programacin II. Gua 11
3 Para Objeto1, el atributo, el resultado del Metodo1 y el parmetro del Metodo2 sern de tipo int, mientras que para el Objeto2, el atributo, el resultado del Metodo1 y el parmetro del Metodo2 sern de tipo float.
En cuanto a la definicin de mtodos, la sintaxis que se aplica es: template <class T> T Plantilla de clase <T> :: Metodo1( ) { // cuerpo de mtodo } En este caso, el mtodo de la clase da un resultado de tipo T. Por lo tanto, el tipo de resultado se definir en el momento de crear un objeto de dicha clase. Para el mtodo2 sera as: template <class T> void Plantilla de clase <T> :: Metodo2(T valor) { // cuerpo de mtodo } En este caso, el mtodo recibe un parmetro que ser del tipo T. Por lo tanto, el tipo se especifica en el momento de declarar el objeto.
Ejemplo 1 Plantillas de Funciones. En el siguiente ejemplo se declaran plantillas de funciones para Max y Raiz. De esta manera, las mismas podrn trabajar sobre diferentes tipos de datos. Es decir, en el momento de invocar a las funciones y al darles los parmetros especficos, se estarn creando versiones diferentes de las mismas, de acuerdo a los tipos de los datos proporcionados.
Error!
Procedimiento #include <iostream> #include <math.h> using namespace std;
// El objetivo de esta plantilla es encontrar el mayor de dos valores dados template <class T> T Max(T Val1, T Val2) { if (Val1 > Val2) return Val1; else return Val2; ; }
Programacin II, Gua 11 4
Ejemplo 2 Plantillas de Funciones. En el siguiente ejemplo se crean las plantillas de funcin, la primera funcin se encarga de intercambiar elementos, la segunda es una funcin que ordena en forma ascendente un vector.
#include <iostream> using namespace std;
// Plantilla de Funcin de intercambio template <class T> void intercambio(T& x, T& y) { T temp=x; x=y; y=temp; }
// Plantilla de Funcin de Ordenamiento de Vector template <class T> void ordenar(T *Tvec,int lon) { int I = 0, j = 0;
// El objetivo de esta plantilla es calcular la raz cuadrada de un valor dado. template <class T> double Raiz(T Num) { return sqrt(Num); }
main ( ) { cout << "Prueba de la plantilla de funcion Max " << endl << endl;
// En las siguientes lneas se invocan las distintas versiones de la funcin Max
cout << "El maximo de 2 y 5 es: " << Max(2, 5) << endl; cout << "El maximo de 5.23 y 6.98 es: " << Max(5.23, 6.98) << endl; cout << "El maximo de 'g' y 'q' es: " << Max('g', 'q') << endl; cout << endl << endl;
cout << "Prueba de la plantilla de funcion Raiz " << endl << endl;
// En las siguientes lneas se invocan las distintas versiones de la funcin Raiz
cout << "La Raiz de 8 es: " << Raiz(8) << endl; cout << "La Raiz de 22.8 es: " << Raiz(22.8) << endl;
system("pause > nul"); }
Programacin II. Gua 11
5
Ejemplo 3 Plantillas de clases. Este ejemplo define una plantilla de clase de nombre Vector, la cual podr definir objetos de distinto tipo, el cual se definir en el momento de la instancia.
int main() { int vectorInt[5]; // Vector de Enteros char vectorChar[5]; // Vector de Caracteres int i;
// Vector de Enteros cout << "Digitar elementos vector Enteros:" << endl; for (i = 0; i < 5; i++) cin >> vectorInt[i];
ordenar(vectorInt,5);
// Imprimir Vector cout << "- Imprimir Vector Ordenado -" <<endl; for (i = 0; i < 5; i++) cout << vectorInt[i] << endl;
// Vector de Caracteres cout << "Digitar elementos vector caracteres:" << endl; for (i = 0; i < 5; i++) cin >> vectorChar[i];
ordenar(vectorChar,5);
// Imprimir Vector cout << "- Imprimir Vector Ordenado -" <<endl; for (i = 0; i < 5; i++) cout << vectorChar[i] << endl;
system("pause > nul"); return 0; }
Programacin II, Gua 11 6
// Plantilla de Clase Vector #include <iostream> using namespace std;
template <class T> class Vector { private: T * Pvec; // Variable tipo T como puntero int indi; // Controla el ndice del vector int elemen; // Numero de elementos del vector
public: // constructor inicializa el vector cuando se crea Vector(int n) { Pvec = new T[n]; // Reserva un espacio de memoria Indi = 0; // Es el ndice del vector elemen = n; // Numero de elementos que posee }; // Destructor libera memoria ~Vector( ) { delete [] Pvec; }
// Sobrecarga de operador [] T& operator [] (int i) { return Pvec[i]; } // Agrega un nuevo elemento void agregar(T i) { Pvec[indi++]=i; }
// Funcin estallena, verifica si el vector tiene elementos bool estallena( ) { return (indi >= elemen); }
// Funcin vervector elementos que posee void vervector() { cout << "Elementos del vector..." << endl; for(int i = 0; i < indi; i++) cout << "--> " << Pvec[i] << endl; } };
Programacin II. Gua 11
7
Ejercicio 1: Modifique el ejemplo 1 y cree las siguientes plantillas de funcin: a) Obtener el mximo y el mnimo elemento del vector. b) Hacer una funcin que reste y sume dos vectores c) Implementar un funcin muestre los elementos del vector Anlisis de Resultados void opciones( ) { cout << "1. Agregar elemento" << endl; cout << "2. Espacio del vector" << endl; cout << "3. Ver Vector" << endl; cout << "4. Salir " << endl; cout << "Seleccione :"; }
int main( ) { Vector <int> V(5); // Definiendo la variable vector de tipo entero int ele; int opc;
do { opciones(); cin >> opc; switch(opc) { case 1: cout << "Digitar elemento a agregar:"; cin >> ele; V.agregar(ele); system("cls"); break;
case 2: if (V.estallena()) cout << "El vector esta lleno..." << endl; else cout << "El Vector esta vacio..." << endl; break;
case 3: V.vervector(); break; } }while(opc != 4);
system("pause"); return 0; } Programacin II, Gua 11 8 d) Implementar una funcin que ordene el vector en forma descendente
Ejercicio 2: Modifique el ejemplo 2 y realizar lo siguiente: a) Hacer una funcin que me diga el numero de elementos que posee el vector b) Incluir funcin que muestre la capacidad mxima de un vector c) Funcin que limpie el vector es decir que lo reinicie
Investigar lo siguiente: Por qu se menciona que las plantillas permiten la reutilizacin de software? Cuales son las desventajas al usar plantillas. Qu son las bibliotecas de clase STL y para que sirven?
Ejercicio: Realizar una plantilla de clase para el manejo de una matriz con las siguientes operaciones: Constructor Destructor Colocar un elemento en la matriz Verificar estado de la matriz (Vacia o llena) Leer elementos de la matriz Ordenar los elementos de la matriz, el usuario decidir si en forma ascendente o en forma descendente. La solucin deber implementarse haciendo uso de un men.
Investigacin Complementaria Programacin II. Gua 11
9
EVALUACIN % 1-4 5-7 8-10 Nota CONOCIMIENTO
Del 20 al 30% Conocimiento deficiente de los fundamentos tericos
Conocimiento y explicacin incompleta de los fundamentos tericos Conocimiento completo y explicacin clara de los fundamentos tericos
Del 40% al 60%
APLICACIN DEL CONOCIMIENTO
ACTITUD Del 15% al 30% No tiene actitud proactiva. Actitud propositiva y con propuestas no aplicables al contenido de la gua. Tiene actitud proactiva y sus propuestas son concretas.