Você está na página 1de 16

Prctica I

Aspectos Generales de Programacin en C++

Objetivos
q Revisar aspectos generales de la programacin en C++ q Detallar temas particulares de C++ necesarios para el desarrollo de las prcticas, como la Genericidad y el manejo de Excepciones

Contenidos
1. 2. 3. 4. 5. Descripcin general del entorno Dev-C++ Genericidad: Templates Miscelnea de C++ Excepciones Programacin modular en C++: Proyectos

Bibliografa
Data Structures and Algorithms in C++. Michael T. Goodrich, M.T; Tamassia, R; Mount, D.M Captulos 1 y 2.
I.T. Informtica de Gestin / Sistemas 1

EDII

Universidad de Huelva

Prctica I

Aspectos Generales de Programacin en C++

1. Entorno de programacin Dev-C++ Entorno de programacin en C++ utilizado en las prcticas de laboratorio de: Metodologa de la programacin I Estructuras de datos I

Documentacin de consulta sobre el entorno Dev-C++: Web de Metodologa de la programacin I: http://www.uhu.es/17203 (Seccin: Descargas Prcticas/Material Complementario)

Primeros pasos en Dev-C++: http://www.uhu.es/17203/Practica0.pdf

EDII

I.T. Informtica de Gestin / Sistemas

Universidad de Huelva

Prctica I

Aspectos Generales de Programacin en C++

2. Programacin modular: Proyectos Para programar con TAD de forma modular es necesario crear un proyecto. A este proyecto habr que agregar los ficheros Por ejemplo, para crear el TAD mi_tipo, hay que crear un proyecto de tipo: "Empty project" mi_tipo.h: Interface del TAD con la declaracin de la clase (cabeceras de los mtodos y estructura del tipo) mi_tipo.cpp: Cuerpo del TAD con la implementacin de los mtodos

Los ficheros que se deben exportar para que un programa usuario pueda hacer uso del tipo mi_tipo y de sus mtodos son: mi_tipo.h: Interface del TAD mi_tipo.o: Cdigo objeto del TAD

Para generar el cdigo objeto del TAD, se debe realizar la compilacin de mi_tipo.cpp mediante la orden: Ejecutar Compilar el archivo actual

EDII

I.T. Informtica de Gestin / Sistemas

Universidad de Huelva

Prctica I

Aspectos Generales de Programacin en C++

El usuario del TAD debe crear un proyecto en el que, adems del programa principal que use el TAD, tiene que aadir (al menos): mi_tipo.h: Interface del TAD. mi_tipo.o: Cdigo objeto del TAD. Este fichero se debe aadir al proceso de link del proyecto del usuario: Opciones del Proyecto Archivos Incluir en el proceso de linkado (enlace) (esto debe hacerse con todos los ficheros objetos que se incluyan) Para compilar y ejecutar el proyecto usuario se utilizar la opcin: compilar_ejecutar, dado que slo debera haber un fichero cpp en tal proyecto (el usuario de los TAD) El preprocesador analiza el fichero fuente antes de la compilacin real, y entre otras tareas procesa las directivas del preprocesador.

Las directivas #ifndef y #define insertadas en ficheros de cabecera .h, evitan que se produzca duplicidad en la inclusin de stos. Por ejemplo, al principio del fichero mi_tipo.h se escribira:
#ifndef _mi_tipo_h_ { acabado en #endif } #define _mi_tipo_h_
I.T. Informtica de Gestin / Sistemas 4

EDII

Universidad de Huelva

Prctica I

Aspectos Generales de Programacin en C++

3. Genericidad: Templates La genericidad en los TAD consiste en proporcionar una declaracin que pueda ser utilizada para distintos tipos concretos La forma mas adecuada de conseguir esto en C++ es mediante el uso de los Templates (plantillas) Por ejemplo, la definicin del tipo genrico mi_tipo sera:
mi_tipo.h mi_tipo.cpp #include mi_tipo.h template <typename E> mi_tipo<E>::mi_tipo (E nelem) { nelementos = nelem; limite=0; } // INSTANCIAS template class mi_tipo<int>; template class mi_tipo<char>; template <typename E> class mi_tipo { private: E nelementos; int limite; public: mi_tipo (E nelem); };

EDII

I.T. Informtica de Gestin / Sistemas

Universidad de Huelva

Prctica I

Aspectos Generales de Programacin en C++

Para poder exportar la clase genrica mi_tipo, hay que instanciarla a los tipos concretos que se deseen. En el ejemplo la clase mi_tipo se ha instanciado para los enteros y los caracteres Esto significa que un programa usuario puede definir y utilizar variables del tipo mi_tipo<int> y mi_tipo<char>

Si el usuario necesitase, por ejemplo, utilizar el tipo mi_tipo<bool>, habra que definir la instancia correspondiente en el fichero mi_tipo.cpp, compilar de nuevo mi_tipo.cpp y exportar mi_tipo.o, para que el usuario lo incluyese de nuevo en su proyecto Si la clase genrica mi_tipo se instancia con otra clase mi_clase, en el fichero mi_tipo.cpp, hay que hacer un #include del fichero mi_clase.h

En este caso podramos definir tipos de la forma: mi_tipo< mi_clase<int> >, para lo cual la clase mi_clase se ha debido instanciar para los enteros

EDII

I.T. Informtica de Gestin / Sistemas

Universidad de Huelva

Prctica I

Aspectos Generales de Programacin en C++


Proyecto mi_clase Proyecto USUARIO

mi_clase.h

mi_clase.cpp <int> <char>

mi_clase.h mi_clase.o

mi_clase.h

mi_clase.o

mi_clase.h Proyecto mi_tipo


mi_tipo.h mi_tipo.o

mi_tipo.h

mi_tipo.cpp <int> <mi_clase>

mi_tipo.h mi_tipo.o

Usuario.cpp

EDII

I.T. Informtica de Gestin / Sistemas

Universidad de Huelva

Prctica I

Aspectos Generales de Programacin en C++

4. Miscelnea de C++ Cuando se declaran varios punteros en la misma lnea, el operador * va ligado al nombre de variable, y no al nombre de tipo: int* x, y, z; // equivale a int* x; int y; int z;

La sintaxis de la instanciacin de una clase genrica usando otra clase genrica debe ser as (por el problema de coincidencia sintctica con el operador >>) : Tipo1< Tipo2<Tipo> > // y no: Tipo1<Tipo2<Tipo>>

El paso de parmetros y valores de retorno de funciones, cuando sea posible, lo realizaremos mediante referencias constantes.

Tambin, cuando sea el caso, haremos constar que los mtodos no modificarn las variables miembro de la clase: const Objeto& mtodo(const tipo1& arg1, const tipo2& arg2) const;

EDII

I.T. Informtica de Gestin / Sistemas

Universidad de Huelva

Prctica I

Aspectos Generales de Programacin en C++

Si se crea un objeto en memoria dinmica con new, se debera en algn momento liberar con delete Cada clase que cree dinmicamente sus propios objetos con new, debera tambin:

definir un destructor para liberar la memoria de esos objetos

definir un constructor de copia para crear el almacenamiento de sus miembros y copiarles el contenido definir un operador de asignacin para liberar almacenamiento del objeto receptor, reservar almacenamiento nuevo, y copiar el contenido: class C { T1 v1; T2* v2; }; C c1, c2;
...

c2 = c1;

// sin un operador de asignacin, se copiara el puntero v2 // pero no a lo que se apunta (T2)

EDII

I.T. Informtica de Gestin / Sistemas

Universidad de Huelva

Prctica I

Aspectos Generales de Programacin en C++

Para inicializar las variables miembro de una clase en un constructor, cuando se trate de variables de tipos no bsicos, habr que hacer uso de las listas de inicializacin, ubicadas entre la lista de argumentos del constructor y su cuerpo La sintaxis es : seguido de una lista separada por comas de la forma miembro(valor_inicial):
class C { private: int x; T y, z; public: C(int i, const T& t1, const T& t2); }; C::C(int i, const T& t1, const T& t2) : y(t1), z(t2) { x = i; };

El orden en el que se inicializan las variables miembro no es el de la lista de inicializacin, sino el orden de declaracin en la clase. Esta lista se ejecuta antes de las sentencias del cuerpo del constructor
EDII I.T. Informtica de Gestin / Sistemas Universidad de Huelva 10

Prctica I

Aspectos Generales de Programacin en C++

5. Excepciones Son condiciones de error o anomalas que ocurren durante la ejecucin de un programa Las excepciones son una alternativa estndar a los cdigos de error. Permiten indicar el tipo de error as como detalles sobre el mismo

Pueden ser ocasionadas por la no disponibilidad de recursos del sistema (memoria, espacio en disco, ...) o por condiciones de los datos (divisin por cero, desbordamiento numrico, ...) Las excepciones se identifican por su tipo, y son consideradas como objetos por s mismas

En la medida de lo posible, las excepciones deben ser "manejadas o "capturadas", para evitar la finalizacin anmala del programa El mecanismo de excepciones de C++ permite que diferentes partes del cdigo realicen los procesos de deteccin y tratamiento de las excepciones

EDII

I.T. Informtica de Gestin / Sistemas

Universidad de Huelva

11

Prctica I

Aspectos Generales de Programacin en C++

La parte del programa que causa o detecta la excepcin, se encarga de "lanzarla". La excepcin puede ser capturada en otra parte del programa Este procesamiento de las excepciones se realiza mediante los bloques try-catch
try { sentencias } catch ( tipo_excepcin identificador ) { sentencias } [ catch ( tipo_excepcin identificador ) { sentencias } ] ... [ catch ( ... ) { sentencias } ] cdigo a partir del cual se lanza la excepcin cdigo que gestiona un tipo de excepcin

EDII

I.T. Informtica de Gestin / Sistemas

Universidad de Huelva

12

Prctica I

Aspectos Generales de Programacin en C++

Tras el bloque try habr uno o ms bloques catch que especifican el tipo de excepciones que capturan La ejecucin comienza en las sentencias del bloque try, y si no se lanza ninguna excepcin, se saltan todos los bloques catch que hubiera. Si se lanza alguna, el control salta al primer bloque catch que capturase ese tipo de excepcin Si una excepcin no se captura en ninguna parte, el programa termina inmediatamente Para lanzar excepciones desde nuestro cdigo, se utiliza throw throw tipo_excepcin Los tipos de excepciones que usaremos sern clases, por lo que tipo_excepcin ser un constructor de clase

Las excepciones del sistema se lanzan automticamente (falta de memoria, ...)

EDII

I.T. Informtica de Gestin / Sistemas

Universidad de Huelva

13

Prctica I

Aspectos Generales de Programacin en C++

El uso de clases en las excepciones permite utilizar una jerarqua de excepciones Utilizaremos una clase Excepcion de la que deriven el resto de excepciones:

class Excepcion { public: Excepcion(const string& err) { mensaje = err; } string Mensaje() const { return mensaje; } private: string mensaje; };

EDII

I.T. Informtica de Gestin / Sistemas

Universidad de Huelva

14

Prctica I

Aspectos Generales de Programacin en C++

Supongamos una funcin para el clculo del porcentaje de dos operandos, con las excepciones de que el divisor sea nulo y que tengan distinto signo:
class ExcepDivCero: public Excepcion { public : ExcepDivCero(): Excepcion("Divisor no puede ser 0") { }; }; class ExcepSigno: public Excepcion { public : ExcepSigno(): Excepcion("Operandos con distinto signo") { }; };

Cuando declaremos un procedimiento o funcin, se deben especificar en su cabecera las excepciones que puede lanzar su cdigo

EDII

I.T. Informtica de Gestin / Sistemas

Universidad de Huelva

15

Prctica I

Aspectos Generales de Programacin en C++

double Porcentaje (double a, double b) throw (ExcepDivCero, ExcepSigno) { if (b == 0) throw ExcepDivCero(); if (a*b < 0) throw ExcepSigno(); return (a / b) * 100; }; ... try { cout << "Porcentaje = " << Porcentaje(a,b); } catch (const ExcepDivCero& e) { cout << e.Mensaje(); } catch (const ExcepSigno& e) { cout << e.Mensaje(); } ...

EDII

I.T. Informtica de Gestin / Sistemas

Universidad de Huelva

16

Você também pode gostar