Sei sulla pagina 1di 9

1

Programacin II. Gua 11






Tema: Plantillas en C++.





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.


for(i = 0; i < lon; i++)
{ for(j = 0; j < lon; j++)
{ if(Tvec[i] < Tvec[j])
intercambio(Tvec[i],Tvec[j]);
}
}
}

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.

TOTAL 100%
Mquina No:

Alumno:

Docente:

GL:

Fecha:
Gua 11: Plantillas en C++.

Hoja de cotejo:

11
1

Potrebbero piacerti anche