Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Kasswed en 9 Mayo 2012, 13:17 pm



Título: "return" no esta funcionando bien al devolver un iterador
Publicado por: Kasswed en 9 Mayo 2012, 13:17 pm
Buenas!

Estoy intentando devolver un iterador en una clase, pero al devolverlo toma valores aleatorios (he comprobado que antes de devolverlo está bien). No sé qué puede estar fallando.

El problema está en la función begin() que os pongo, en el return creo. Esto me está dando un montón de problemas...

Os pongo un poco de código:

Código
  1. template <typename T>
  2. class vectorDinamico {
  3.    private:
  4.        list<vector<T> > datos;
  5.        int tamBloque;
  6.    public:
  7.        vectorDinamico();
  8.        vectorDinamico ( int tam );
  9.        ~vectorDinamico();
  10.        vectorDinamico<T>& operator= ( const vectorDinamico<T> &v );
  11.        vectorDinamico ( const vectorDinamico<T> &v );
  12.  
  13.        class iterator;
  14.        friend class iterator;
  15.  
  16.        /* Clase iterator */
  17.        class iterator {
  18.            private:
  19.                typename list<vector<T> >::iterator it_l;
  20.                typename vector<T>::iterator it_v;
  21.                friend class vectorDinamico;
  22.            public:
  23.                /* Implementamos algunos métodos del iterador */
  24.                iterator();
  25.                iterator ( const typename vectorDinamico<T>::iterator &it );
  26.                iterator& operator++();
  27.                iterator& operator--();
  28.                T& operator*();
  29.                iterator& operator= ( const typename vectorDinamico<T>::iterator &it );
  30.            };
  31.        /* Fin clase iterator */
  32.        iterator begin();
  33.        iterator end();
  34.  
  35.  
  36. template <typename U> friend ostream& operator<<(ostream& out,const vectorDinamico<U> &v);
  37.  
  38.        void insert ( iterator it, const T &x );
  39.    };
  40.  
  41.  
  42. template <typename T>
  43. vectorDinamico<T>::iterator::iterator() {}
  44.  
  45. template <typename T>
  46. vectorDinamico<T>::iterator::iterator ( const typename vectorDinamico<T>::iterator &it ) {
  47.    it_l = it.it_l;
  48.    it_v = it.it_v;
  49.    }
  50.  
  51.  
  52. template <typename T>
  53. typename vectorDinamico<T>::iterator vectorDinamico<T>::begin() {
  54.    typename vectorDinamico<T>::iterator it;
  55.    vector<T> aux;
  56.    it.it_l = datos.begin();
  57.    aux = *it.it_l;
  58.    it.it_v = aux.begin();
  59.    return it;
  60.    }
  61.  
  62. template <typename T>
  63. typename vectorDinamico<T>::iterator& vectorDinamico<T>::iterator::operator= ( const typename vectorDinamico<T>::iterator &it ) {
  64.    it_l = it.it_l;
  65.    it_v = it.it_v;
  66.    return *this;
  67.    }
  68.  
  69. template <typename T>
  70. T& vectorDinamico<T>::iterator::operator*() {
  71.    return *it_v;
  72.    }

¿Alguien sabe qué esta fallando?

Decir que devolver el iterador por referencia no lo veo viable, puesto que it se destruye al salir de la función... ¿no?

Saludos!


Título: Re: "return" no esta funcionando bien al devolver un iterador
Publicado por: Kasswed en 9 Mayo 2012, 13:42 pm
Problema resuelto..

No había caído en que el vector aux se elimina, así que no se puede usar así. Lo he resuelto haciendo:

Código
  1. template <typename T>
  2. typename vectorDinamico<T>::iterator vectorDinamico<T>::begin() {
  3.    typename vectorDinamico<T>::iterator it;
  4.    it.it_l = datos.begin();
  5.    it.it_v = (*it.it_l).begin();
  6.    return it;
  7.    }