utilidades c++

Upload: diego-aranda-a

Post on 06-Jul-2018

225 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/17/2019 utilidades c++

    1/15

    Otras utilidades de C++

    FACULTAD DE INFORMÁTICA

    Programación orientada a objetos  — Unidad 12

    Autor: Luis Hernández Yáñez (modificado por Eva Ullán) Programación orientada a objetos (Fac. de Informática) Unidad 12 - 1

    Contenido

    Sobrecarga de insertores y extractores ... 2

    Insertores y extractores para objetos ... 7Funciones amigas ... 8

    Clases amigas ... 10

    Prohibición de copia ... 12

    Plantillas de funciones ... 13

    Plantillas de clase ... 16

    Una lista polimórfica genérica ... 20

    Manejo de errores ... 28

    Manejo de excepciones ... 33

    La Biblioteca estándar de plantillas (STL) ... 44

    Programación orientada a objetos (Fac. de Informática) Unidad 12 - 2

    Sobrecarga de insertores y extractores

    Como ya sabemos, un insertor es un operador > que sirve para recogerinformación de un flujo o canal de entrada (normalmente el teclado).

     Ya hemos usado algunos insertores predefinidos para mostrar

    información en la pantalla:cout > variable

    donde variable puede ser de algún tipo numérico, de tipo caráctero de tipo string.

    Programación orientada a objetos (Fac. de Informática) Unidad 12 - 3

    Sobrecarga de insertores y extractores

    En las clases que hemos desarrollado hemos incluido normalmenteun método mostrar() que se encarga de mostrar la informacióndel objeto en la pantalla:

    unaPersona.mostrar();

    Podría resultar interesante que la información de los objetos se

    pudiera mostrar en la pantalla usando un insertor, en lugar delmétodo mostrar():

    cout

  • 8/17/2019 utilidades c++

    2/15

    Programación orientada a objetos (Fac. de Informática) Unidad 12 - 4

    Sobrecarga de insertores y extractores

    Para definir un insertor para un tipo de datos, sobrecargamosel operador >(istream &stream, tipo & dato ){// Código para el tipo de dato específicoreturn stream;

    }

    En ambos casos, stream es el canal o flujo (de salida o de entrada).

    Programación orientada a objetos (Fac. de Informática) Unidad 12 - 5

    Sobrecarga de insertores y extractores

    Por ejemplo, supongamos que tenemos definido un tipo TresD:

    struct TresD {int x, y, z;

    }; // Puntos en un espacio tridimensional

    Un insertor y un extractor adecuados para el tipo TresD serían:

    ostream& operator  punto;

    cout

  • 8/17/2019 utilidades c++

    3/15

    Programación orientada a objetos (Fac. de Informática) Unidad 12 - 8

    Funciones amigas

     Al no estar definida la función insertora anterior en la clase,no se deja patente que se ha construido para ser utilizadacon objetos de esa clase.

    Existe una alternativa: declarar la función como amiga de la clase.Basta incluir el prototipo de la función en la declaración de la clase,precediéndolo de la palabra reservada friend :

    class Fraccional {...

    friend ostream& operator(istream &stream, Fraccional&);

     private:...

    };

    Inconveniente: las funciones amigas no son funciones miembro(métodos), por lo que no se pueden definir como virtuales.

    Programación orientada a objetos (Fac. de Informática) Unidad 12 - 9

    Funciones amigas

     A las funciones amigas se les permite acceder a los atributos de losobjetos-argumento (a todo: también a lo privado y a lo protegido delos objetos):

    ostream& operator 

  • 8/17/2019 utilidades c++

    4/15

  • 8/17/2019 utilidades c++

    5/15

  • 8/17/2019 utilidades c++

    6/15

    Programación orientada a objetos (Fac. de Informática) Unidad 12 - 20

    // Clase Lista (genérica) - Archivo único "lista.h"#ifndef listaH#define listaH

    #include  using namespace std;

    template  class Lista { public: // Parámetro de plantilla con valor por defecto

    Lista();Lista(const Lista&);Lista& operator=(const Lista&);~Lista(); bool llena() const; bool vacia() const;int cont() const;

     bool insertar(X*); bool recuperar(int, X**) const; // la posición, de 1 a cont() bool eliminar(int); // la posición, de 1 a cont()void  mostrar() const;

    Una lista polimórfica genérica

    (continúa )

    Programación orientada a objetos (Fac. de Informática) Unidad 12 - 21

     private:X* _array[ MAX];int _cont;

    };

    template  Lista::Lista() : _cont(0) {}

    template  Lista::Lista(const Lista& otra) { _cont = otra._cont;for(int i = 0; i < _cont; i++) _array[i] = otra._array[i]->clon();

    }

    template  Lista& Lista::operator=(const Lista& otra) {

    for(int i = 0; i < _cont; i++) delete _array[i]; _cont = otra._cont;for(int i = 0; i < _cont; i++) _array[i] = otra._array[i]->clon();return *this;

    }

    Una lista polimórfica genérica

    (continúa )

    Programación orientada a objetos (Fac. de Informática) Unidad 12 - 22

    template  Lista::~Lista() {for(int i = 0; i < _cont; i++) delete _array[i];

    }

    template   bool Lista::llena() const {

    return _cont == MAX;}

    template  bool Lista::vacia() const {

    return _cont == 0;}

    template int Lista::cont() const {return _cont;

    }

    Una lista polimórfica genérica

    (continúa )

    Programación orientada a objetos (Fac. de Informática) Unidad 12 - 23

    template  bool Lista::insertar(X* p) {

    if(_cont == MAX) return false; _array[_cont] = p; _cont++;return true;

    }

    template  bool Lista::recuperar(int pos, X** p) const {

    if(pos < 1 || pos > _cont) return false;*p = _array[pos-1];return true;

    }

    Una lista polimórfica genérica

    (continúa )

  • 8/17/2019 utilidades c++

    7/15

  • 8/17/2019 utilidades c++

    8/15

  • 8/17/2019 utilidades c++

    9/15

  • 8/17/2019 utilidades c++

    10/15

  • 8/17/2019 utilidades c++

    11/15

    Programación orientada a objetos (Fac. de Informática) Unidad 12 - 40

    Si la excepción se puede producir en el código de una clase (en unafunción miembro), la clase de error se declara en aquella clase:

    #include  using namespace std;class UnaClase { public:

    class UnError { }; // Clase de excepcionesvoid funcion() { ... throw UnError(); ... }

    ...};int main(){

    try {

    UnaClase obj1;obj1.funcion();}catch(UnaClase::UnError) { ... }...

    Manejo de excepciones

    Programación orientada a objetos (Fac. de Informática) Unidad 12 - 41

    Un ejemplo más complejo:

    #include  

    #include  using namespace std;

    class Error { public:

    Error(string m) : _mensaje(m) { }string mensaje() { return _mensaje; }

     private:string _mensaje;

    };

    Manejo de excepciones

    (continúa )

    Una clase de errores en general

    Programación orientada a objetos (Fac. de Informática) Unidad 12 - 42

    class Suberror1 : public Error { public:

    Suberror1(string m) : Error(m) {}};

    class Suberror2 : public Error { public:Suberror2(string m) : Error(m) {}

    };

    void eleva() throw(Suberror2) {throw Suberror2("suberror2");

    }

    Manejo de excepciones

    (continúa )

    Una clase de errores concretos

    Otra clase de errores concretos

    Especificación de excepciones Indica las excepciones que eleva esa funciónSe eleva la excepción

    en la función eleva()

    Programación orientada a objetos (Fac. de Informática) Unidad 12 - 43

    int main(){try {try {eleva();

    }

    catch(Suberror1 obj) {cout

  • 8/17/2019 utilidades c++

    12/15

  • 8/17/2019 utilidades c++

    13/15

  • 8/17/2019 utilidades c++

    14/15

  • 8/17/2019 utilidades c++

    15/15

    Programación orientada a objetos (Fac. de Informática) Unidad 12 - 56

    try {vec.at(100) = 777; // Fuera de intervalo

    }catch(out_of_range) {cout