imagen.h
Código:
imagen.tpp#ifndef IMAGEN_H_ #define IMAGEN_H_ #include <iostream> #include <cassert> #include "imagenES.h" template <class T> class Imagen{ T** pixeles; ///< Vector de tipo T que almacena los píxeles de una imagen. int filas; ///< Número de filas de la imagen. int col; ///< Número de columnas de la imagen. void Copiar(const Imagen<T> &orig, Imagen<T> &dest); void Borrar(Imagen<T> &dest); public: Imagen() { filas=col=0;pixeles=0;} Imagen(int f, int c); Imagen(int f, int c, T *pixeles); void getVector(T* &vector); Imagen(const Imagen<T> &img); ~Imagen(); Imagen<T> & operator=(const Imagen<T> &img); int num_filas() const {return filas; }; int num_columnas() const {return col; }; T & operator()(int fila, int col){ return pixeles[fila][col]; } const T & operator()(int fila, int col) const { return pixeles[fila][col]; } /*************************************************************/ /* CLASE ITERATOR_FILA */ /*************************************************************/ class iterator_fila{ T **p; int ncol; public: iterator_fila() { p=0; ncol=0; } iterator_fila(const iterator_fila &it): p(it.p) {} ~iterator_fila() {} T* & operator*() const { assert(p!=0); return *p; } bool operator==(const iterator_fila &it){ return p==it.p; } bool operator!=(const iterator_fila &it){ return p!=it.p ; } iterator_fila& operator=(const iterator_fila& orig) { p=orig.p; ncol=orig.ncol; return *this; } iterator_fila& operator++() { assert(p!=0); p++; return *this; } iterator_fila& operator--() { assert(p!=0); p--; return *this; } /*************************************************************/ /* CLASE ITERATOR_COLUMNA */ /*************************************************************/ class iterator_columna{ T *q; public: iterator_columna():q(0) {} iterator_columna(const iterator_columna& it): q(it.q) {} ~iterator_columna() {} T & operator*() const { assert(q!=0); return *q; } bool operator==(const iterator_columna &it) { return q==it.q; } bool operator!=(const iterator_columna &it) { return q!=it.q; } iterator_columna& operator=(const iterator_columna &orig) { q=orig.q; return *this; } iterator_columna& operator++() { assert(q!=0); q++; return *this; } iterator_columna& operator--() { assert(q!=0); q--; return *this; } friend class Imagen<T>; friend class Imagen<T>::iterator_fila; }; // FIN iterator_columna iterator_columna begin(); iterator_columna end(); friend class Imagen<T>; friend class Imagen<T>::iterator_fila::iterator_columna; }; // FIN iterator_fila /*************************************************************/ /* CLASE CONST_ITERATOR_FILA */ /*************************************************************/ class const_iterator_fila{ T **p; int ncol; public: const_iterator_fila() { p=0; ncol=0; } const_iterator_fila(const const_iterator_fila &it):p(it.p) {} ~const_iterator_fila() {} const T* & operator*() const { assert(p!=0); return *p; }; bool operator==(const const_iterator_fila &it){ return p==it.p; } bool operator!=(const const_iterator_fila &it){ return p!=it.p; } const_iterator_fila& operator=(const const_iterator_fila& orig) { p=orig.p; ncol=orig.ncol; return *this; } const_iterator_fila& operator++() { assert(p!=0); p++; return *this; } const_iterator_fila& operator--() { assert(p!=0); p--; return *this; } /*************************************************************/ /* CLASE CONST_ITERATOR_COLUMNA */ /*************************************************************/ class const_iterator_columna{ T *q; public: const_iterator_columna():q(0) {} const_iterator_columna(const const_iterator_columna& it):q(it.q) {} ~const_iterator_columna() {} const T & operator*()const { assert(q!=0); return *q; } bool operator==(const const_iterator_columna &it) { return q==it.q; } bool operator!=(const const_iterator_columna &it) { return q!=it.q; } const_iterator_columna& operator=(const const_iterator_columna &orig) { q=orig.q; return *this; } const_iterator_columna& operator++() { assert(q!=0); q++; return *this; } const_iterator_columna& operator--() { assert(q!=0); q--; return *this; } friend class Imagen<T>; friend class Imagen<T>::const_iterator_fila; }; // FIN const_iterator_columna const_iterator_columna begin() const; const_iterator_columna end() const; friend class Imagen<T>; friend class Imagen<T>::const_iterator_fila::const_iterator_columna; }; // FIN const_iterator_fila iterator_fila begin(); iterator_fila end(); const_iterator_fila begin() const; const_iterator_fila end() const; }; #include "imagen.tpp" #endif
Código:
/*************************************************************/ /* IMPLEMENTACIÓN */ /*************************************************************/ #include <iostream> using namespace std; template <class T> void Imagen<T>::Copiar(const Imagen<T> &orig, Imagen<T> &dest){ dest.filas=orig.filas; dest.col=orig.col; dest.pixeles=new T*[dest.filas]; dest.pixeles[0]=new T[dest.filas*dest.col]; for(int i=0;i<dest.filas*dest.col;i++) dest.pixeles[0][i]=orig.pixeles[0][i]; for(int i=1;i<dest.filas;i++) dest.pixeles[0]=dest.pixeles[i-1]+dest.col; } template <class T> void Imagen<T>::Borrar(Imagen<T> &dest){ delete[] dest.pixeles[0]; delete[] dest.pixeles; dest.filas=dest.col=0; dest.pixeles=0; } /*************************************************************/ /* Funciones asociadas a la clase Imagen */ /*************************************************************/ template <class T> Imagen<T>::Imagen(int f, int c){ this->pixeles=new T*[f]; this->pixeles[0]=new T[f*c]; for(int i=1;i<f;i++) pixeles[i]=pixeles[i-1]+c; filas=f; col=c; } template <class T> Imagen<T>::Imagen(int f, int c,T *pixeles){ this->filas=f; this->col=c; this->pixeles=new T*[f]; this->pixeles[0]=new T[f*c]; for(int i=0;i<f*c;i++) this->pixeles[0][i]=pixeles[i]; for(int i=1;i<f;i++) this->pixeles[i]=this->pixeles[i-1]+c; } template <class T> void Imagen<T>::getVector(T* &vector) { vector=new T[filas*col]; for(int i=0;i<filas*col;i++) vector[i]=pixeles[0][i]; template <class T> Imagen<T>::Imagen(const Imagen<T> &img){ Copiar(img,*this); } template <class T> Imagen<T>::~Imagen(){ Borrar(*this); } //OPERATOR IGUAL CLASE IMAGEN template <class T> Imagen<T> & Imagen<T>::operator=(const Imagen<T> &img){ if(this!=&img){ Borrar(*this); Copiar(img,*this); } return *this; } /*************************************************************/ /* BEGIN Y END */ /*************************************************************/ template <class T> typename Imagen<T>::iterator_fila::iterator_columna Imagen<T>::iterator_fila::begin(){ typename Imagen<T>::iterator_fila::iterator_columna it; it.q=*p; return it; } template <class T> typename Imagen<T>::iterator_fila::iterator_columna Imagen<T>::iterator_fila::end(){ typename Imagen<T>::iterator_fila::iterator_columna it; it.q=(*p+ncol); return it; } template <class T> typename Imagen<T>::iterator_fila Imagen<T>::begin(){ typename Imagen<T>::iterator_fila it; it.p=pixeles; it.ncol=col; return it; } template <class T> typename Imagen<T>::iterator_fila Imagen<T>::end(){ typename Imagen<T>::iterator_fila it; it.p=(&pixeles[0]+filas); return it; } template <class T> typename Imagen<T>::const_iterator_fila::const_iterator_columna Imagen<T>::const_iterator_fila::begin() const{ typename Imagen<T>::const_iterator_fila::const_iterator_columna it; it.q=*p; return it; } template <class T> typename Imagen<T>::const_iterator_fila::const_iterator_columna Imagen<T>::const_iterator_fila::end() const{ typename Imagen<T>::const_iterator_fila::const_iterator_columna it; it.q=(*p+ncol); return it; } template <class T> typename Imagen<T>::const_iterator_fila Imagen<T>::begin() const{ typename Imagen<T>::const_iterator_fila it; it.p=pixeles; it.ncol=col; return it; } template <class T> typename Imagen<T>::const_iterator_fila Imagen<T>::end() const{ typename Imagen<T>::const_iterator_fila it; it.p=(&pixeles[0]+filas); return it; }