Está en la página 1de 6

PRACTICA No.

4 2 DEPARTAMENTAL
PRACTICA No. 4 USO DE CLASES TEMPLATE

GRUPO: 31-13

1) INTRODUCCIN TERICA: PLANTILLAS Se ha aadido recientemente a C++ una nueva caracterstica: plantillas. A pesar de que no form parte de la especificacin original de C++, est definida en el estndar ANSI C++ propuesto y est admitida en la mayora de los compiladores actuales de C++. CLASES GENRICAS Adems de las funciones genricas, tambin puede definirse una clase genrica. Esto significa crear una clase que define todos los algoritmos usados por ella, pero el tipo de datos que, realmente, va a ser manipulado se especificar como un parmetro cuando se creen los objetos de esa clase. Las clases genricas son tiles cuando una clase contiene una lgica generalizable. Por ejemplo, el mismo algoritmo que almacena una cola de enteros tambin funciona para una cola de caracteres. El mismo mecanismo que almacena una lista enlazada de direcciones postales podra almacenar una lista enlazada con informacin sobre piezas de vehculos. Mediante una clase genrica se puede crear una clase que almacenar una cola, una lista enlazada y cualquier tipo de datos. El compilador generar automticamente el tipo adecuado de objeto en funcin del tipo que se especifique cuando se crea el objeto. La forma general de la declaracin de una clase genrica se muestra aqu: template < class Ttype> class class-name { ... } Ttype es el nombre del tipo resguardo que se especificar cuando se instancia la clase. Si es necesario, puede definirse ms de un tipo de datos genricos utilizando una lista separada por comas Una vez que se ha creado una clase genrica se puede crear una instancia especfica de esa clase, utilizando la siguiente forma general: class-name < type> ob; type es el nombre del tipo de datos sobre el que trabajar la clase. Los miembros de una clase genrica son, por s mismos, genricos. No es necesario utilizar templa te para especificados como tales. EJEMPLO: Este programa crea una sencilla clase genrica de lista enlazada. A continuacin muestra la clase creando una lista enlazada que almacena caracteres: // Una sencilla lista enlazada next = 0; } genrica. #include <iostream.h> main ( ) { templa te <class data_t> class list<char> start('a'); list { list<char> *p, *last; data_t data; int i; list *next; // construccin de una lista public: last = &start; list (data_t d); for(i=l; i<26; i++) { void add(list *node) {node->next = p = new list<char> ('a' + i); this; next = 0; } p->add(last) ; list *getnext() { return next; } last = p; } data_t getdata() { return data; } // sigue la lista }; p = &start; template <class data_t> while (p) { list<data_t>: :list(data_t d){ cout<<p->getdata(); data = d; p = p->getnext(); }

PRACTICA No. 4 2 DEPARTAMENTAL


return 0; }

GRUPO: 31-13

Como puede observarse, la declaracin de una clase genrica es similar a la de una funcin genrica. El tipo real de datos almacenado por la lista, en la declaracin de la clase, es genrico. Cuando se declara un objeto de la lista se determina el tipo real de los datos. En este ejemplo, los objetos y punteros se declaran dentro de main( ), que especifica que el tipo de datos de la lista ser char. 2) DESARROLLO Modifique el siguiente cdigo de la siguiente manera: 1. Utilizando clases genricas. 2. Manejo de excepciones para new. 3. Muestre para 2 tipos de datos diferentes el funcionamiento del programa, uno de ellos debe ser de tipo char. CODIGO A MODIFICAR #include<iostream.h> #include<stdlib.h> #include<conio.h> #define PilaVacia (cima==NULL) typedef class datos elemento; class datos{ private: float dato; class datos*siguiente; public: void error (void); elemento*NuevoElemento(); void push (elemento**,float); float pop (elemento**); void mostrar (elemento*); }; main(){ elemento*cima=NULL; elemento *pila=NULL; float a; clrscr(); for(int i=0;i<5;i++){ pila->push(&cima,i); pila-> mostrar(cima); } cout<<"\n\nContenido: \n"; for(i=0;i<5;i++) { a=pila->pop(&cima); cout<<"\t"<<a; } cin.get(); return 0; } void elemento::error(void){ cerr<<"error, espacio insuficiente"; exit(1);} elemento*elemento::NuevoElemento(){ elemento* q=(elemento*)new(elemento); if(!q) error(); return(q); } void elemento::push(elemento**p,float x){ elemento *q,*cima; cima=*p; q =NuevoElemento(); q->dato=x; q->siguiente=cima; cima=q; *p=cima;} float elemento::pop(elemento**p){ elemento *cima; float x; cima=*p; if(PilaVacia){ cout<<"\nerror:pop de la pila vaca"; return 0; } else { x=cima->dato; *p=cima->siguiente; delete(cima); return(x); } } void elemento::mostrar(elemento *p) { elemento *cima; cima=p; cout<<"\n\n contenido de la pila\nValor:"; while(!PilaVacia) { float x=cima->dato;

PRACTICA No. 4 2 DEPARTAMENTAL


cima=cima->siguiente; ALGORITMO DE SOLUCIN cout<<"->"<<x; } }

GRUPO: 31-13

Realizar el cambio de la clase datos a una clase genrica, esto implica modificar la declaracin tanto de la clase como la de las funciones miembro. Modificar tambin la forma en como se checa la existencia de memoria para la creacin de un objeto, colocando el manejo de excepciones de new. Realizar la prueba para dos tipos de datos diferentes. pila2->push(cima2,'A'+i); pila2-> mostrar(cima2); } CODIFICACIN #include<iostream.h> #include<stdlib.h> #include<conio.h> #include<new.h> #define PilaVacia (cima==NULL) template <class tipo> class datos{ private: tipo dato; class datos<tipo> *siguiente; public: datos<tipo>* NuevoElemento(); void push (datos<tipo>*&,tipo); tipo pop (datos<tipo>*&); void mostrar (datos<tipo>*); }; void Error(); main(){ set_new_handler(Error); datos<float> *cima=NULL; datos<float> *pila=NULL; float a; clrscr(); for(int i=0;i<5;i++){ pila->push(cima,i); pila-> mostrar(cima); } cout<<"\n\nContenido: \n"; for(i=0;i<5;i++){ a=pila->pop(cima); cout<<"\t"<<a; } cin.get(); clrscr(); datos<char> *cima2=NULL; datos<char> *pila2=NULL; char ab; for(i=0;i<5;i++){ cout<<"\n\nContenido: \n"; for(i=0;i<5;i++){ ab=pila2->pop(cima2); cout<<"\t"<<ab; } cin.get(); return 0; } void Error(){ cerr<<"Memoria Insuficiente"; exit(1); } template <class tipo> datos<tipo> *datos<tipo>::NuevoElemento(){ datos<tipo> *q=(datos<tipo>*)new(datos<tipo>); return (q); } template <class tipo> void datos<tipo>::push(datos<tipo>*&p,tipo x){ datos<tipo> *q,*cima; cima=p; q =NuevoElemento(); q->dato=x; q->siguiente=cima; cima=q; p=cima; } template <class tipo> tipo datos<tipo>::pop(datos<tipo>*&p) datos<tipo> *cima; float x; cima=p; if(PilaVacia){

PRACTICA No. 4 2 DEPARTAMENTAL


cout<<"\nerror:pop de la pila vacia"; return 0; } else{ x=cima->dato; p=cima->siguiente; delete(cima); return(x); }

GRUPO: 31-13

*p){

void datos<tipo>::mostrar(datos<tipo>

template <class tipo>

datos<tipo> *cima; cima=p; cout<<"\n\n contenido pila\nValor:"; while(!PilaVacia) {float x=cima->dato; cima=cima->siguiente; cout<<"->"<<x; } }

de

la

IMPRESIN DE PANTALLA contenido de la pila Valor:->0

PRACTICA No. 4 2 DEPARTAMENTAL


contenido de la pila Valor:->1->0 contenido de la pila Valor:->2->1->0 contenido de la pila Valor:->3->2->1->0 contenido de la pila Valor:->4->3->2->1->0 Contenido: 4 3 2 1 0

GRUPO: 31-13

contenido de la pila Valor:->65 contenido de la pila Valor:->66->65 contenido de la pila Valor:->67->66->65 contenido de la pila Valor:->68->67->66->65 contenido de la pila Valor:->69->68->67->66->65 Contenido: E D 3) CONCLUSIONES HERNNDEZ PREZ MARCO ANTONIO Mi conclusin a cerca de esta practica, es que fue muy adecuada su realizacin, pues nos hizo recordar como es que se realiza la transformacin de una clase con variables especificas a una clase genrica, as como el cambio que se hace en las funciones miembro de la clase, como tambin en la forma de crear los mismos objetos de la clase. Por otra parte no solo se debe tomar en cuenta, el cambio que se pide del programa pues antes de poder cambiar la codificacin se debe entender el programa mismo, pues de no ser as se puede obtener un programa que no realice lo especificado o simplemente el mismo compilador no deje correr el programa como pudo ser el caso de no cambiar el uso de typedef del programa por que al trabajar con template no se puede ocupar este. C B A

PRACTICA No. 4 2 DEPARTAMENTAL

GRUPO: 31-13

SANTIAGO ROSADO JOS DE JESS BIBLIOGRAFA C++ Gua de Autoenseanza Schildt Herbert Edit. Mc Graw Hill

También podría gustarte