Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: K-YreX en 6 Enero 2019, 10:30 am



Título: Sobrecarga operador -> [C++]
Publicado por: K-YreX en 6 Enero 2019, 10:30 am
Tengo la siguiente clase y estoy intentando sobrecargar el operador -> pero sólo puedo sobrecargarlo con constantes, me explico:
Código
  1. class ConjuntoEnteros{
  2.    private:
  3.        std::set<int> private_set;
  4.    public:
  5.        ConjuntoEnteros();
  6.        // ...
  7.        class Iterator{
  8.            private:
  9.                 std::set<int>::iterator private_iterator;
  10.            public:
  11.                  Iterator();
  12.                  // ...
  13.                  int* operator->(){
  14.                      return &*private_iterator;
  15.                  }
  16.         };
  17. };

Entonces si intento sobrecargar ese operador -> me da un error. Lo he conseguido solucionar modificándolo así:
Código
  1. const int* operator->(){
  2.     return &*private_iterator;
  3. }

Entonces no sé si es posible sobrecargar ese operador cómo lo había intentado al principio o siempre tiene que ser constante. :-X


Título: Re: Sobrecarga operador -> [C++]
Publicado por: Cero++ en 6 Enero 2019, 14:26 pm
Pues mira, creo que poniendo
Código
  1. int operator->()const
Se arregla la cosa, no tengo muy bien entendido si es un puntero a entero la variable
Código
  1. private_iterator
pero poniéndolo como yo digo, se arregla
Código
  1. int operator->()const{
  2. return *private_iterator; //Saque el alias y puse desreferencia
  3. }
Si me decís qué es la variable iterator_private, podemos llegar a una conclusión juntos  :xD


Título: Re: Sobrecarga operador -> [C++]
Publicado por: K-YreX en 6 Enero 2019, 17:21 pm
La variable <private_iterator> es un std::set<T>::iterator, es decir; un iterador de set. El tema de hacer que devuelva un puntero a entero es porque si no se usa la flecha la otra alternativa sería esta:
Código
  1. (*private_iterator).metodo();
  2. private_iterator->metodo();

Por eso he deducido que el valor de retorno del operador -> sería un puntero al tipo de dato que retorna el *.

PD: No he probado si se soluciona con lo que me comentas de hacer el método constante. Cuando pueda lo probaré y si funciona ya lo comentaré por aquí. Es que he estado buscando bastante información en internet sobre este operador y sobre sobrecargarlo y lo único que he encontrado es que se puede sobrecargar pero no he encontrado cómo se haría. Gracias por la respuesta :-X



Pues mira, creo que poniendo
Código
  1. int operator->()const

Ya he probado esto a ver si funciona y no. Tengo el mismo problema usando esa función que si uso la primera que he mostrado yo. De momento la única solución que he encontrado es que el valor de retorno sea constante. Si alguien sabe algo más al respecto... :-X