elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Sobrecarga operador +
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Sobrecarga operador +  (Leído 2,625 veces)
_Enko


Desconectado Desconectado

Mensajes: 538



Ver Perfil WWW
Sobrecarga operador +
« en: 5 Febrero 2015, 15:43 pm »

Hola, estoy practicando el tema de sobrecarga y me tope con 2 problemas. :silbar:

Código
  1. class Foo
  2. {
  3. public:
  4. //Foo& operator+(const Foo& f); tampoco funciona
  5. //Si funciona (Foo& f)
  6. Foo& operator+(Foo const& f){
  7. bar_ += f.getBar();
  8. return *this;
  9. }
  10. int getBar(){
  11. return bar_;
  12. }
  13. private:
  14. int bar_;
  15. };
  16.  
Por alguna razon, cuando sobrecargo el operador +, Visual Studio 2010 me exigue que el parametro sea una referencia simple "Foo& f" y no const. Si coloco const, salta error que no puede convertir de const & a & desde el metodo Foo::getBar().
No tengo visual studio a mano como pasar el error exacto.
(passing `const Foo' as `this' argument of `int Foo::getBar()' discards qualifiers )

Otra cosa, en http://www.parashift.com/c++-faq/overview-op-ov.html
Coloca este ejemplo
Código:
  Fred operator+ (Fred const& x, Fred const& y);
Pero vc++ y blodshed dev c++ tambien se quejan de que solo se puede pasar un argumento a un operador unario.

Será que tiene solamente parcial soporte de c++11?

Saludos y Gracias


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Sobrecarga operador +
« Respuesta #1 en: 5 Febrero 2015, 15:55 pm »

getbar no es const, no puedes llamar a un método "no const" desde una referencia "const".

Por otro lado, el otro ejemplo que has puesto:

Código
  1. Fred operator+ (Fred const& x, Fred const& y);

Este ejemplo únicamente compila si el operador se sobrecarga fuera de la clase "Fred". Eso sí, para asegurar un funcionamiento óptimo lo suyo es hacer que este método sea "friend" de la clase "Fred".


En línea

_Enko


Desconectado Desconectado

Mensajes: 538



Ver Perfil WWW
Re: Sobrecarga operador +
« Respuesta #2 en: 5 Febrero 2015, 17:58 pm »

Muchas gracias :)

Tiene sentido si se toma "Foo const& f" como referencia a Foo constante, all llamar a  algun metodo de f, es posible que este modifique el objeto.

Entonces, "const Foo& f" es lo mismo que "Foo const&  f"?

Hay alguna manera de hacer "constante referencia  a Foo" y no "referencia a Foo constante"?

Me refiero a :
Código
  1. void f(foo "referencia constante a" f){
  2.        f = foo(); //error, f referenciaria otro objeto
  3.        f.set(valor); //ok, f sigue referenciando a f pero con un miembro cambiado de valor.
  4. }
  5.  

Es decir, que se pueda cambiar los miembros de la referencia, pero no la referencia.

PD, creo que correctamente seria asi el la sobrecarga de +?
Código
  1. Foo operator+(const Foo& f)
  2. {
  3.        Foo b;
  4. b.bar_ = this->bar_ + f.bar_;
  5. return b;
  6. }
  7.  

Y tambien, + tendria que devolver objeto  nuevo mientras que += referencia al objeto?
Código
  1. Foo operator+(const Foo& f);
  2. Foo& operator+=(Foo const& f);
  3.  


Saludos y Gracias.
« Última modificación: 5 Febrero 2015, 18:23 pm por _Enko » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Sobrecarga operador +
« Respuesta #3 en: 6 Febrero 2015, 08:04 am »

Entonces, "const Foo& f" es lo mismo que "Foo const&  f"?

Es lo mismo sí.

Hay alguna manera de hacer "constante referencia  a Foo" y no "referencia a Foo constante"?

Foo& variable -> "constante referencia a Foo"
const Foo& variable -> "referencia a Foo constante"

Cuando declaras una referencia, el compilador te obliga a darle un valor en ese mismo momento. Despuées de la inicialización, verás que no vas a poder modificar la referencia. Es decir, el enlace de referencia es constante siempre. Debido a esto, el modificador "const" únicamente tiene sentido si amplía la cobertura... y de la única forma en la que puede hacer esto es haciendo que la clase o variable sea de solo lectura.

PD, creo que correctamente seria asi el la sobrecarga de +?
Código
  1. Foo operator+(const Foo& f)
  2. {
  3.        Foo b;
  4. b.bar_ = this->bar_ + f.bar_;
  5. return b;
  6. }
  7.  

Es una forma de implementarlo... ahora, si Foo tiene un constructor que permite inicializar "bar_", es un poco más eficiente llamar a dicho constructor:

Código
  1. Foo operator+(const Foo& f) const
  2. {
  3.        return Foo{ bar_ + f.bar_ };
  4. }

Por cierto, nota el "const" de la función... los operadores que no tienen el igual no deberían modificar la instancia actual y deberían, por tanto, ser "const". Puede parecer una tontería, pero ya has visto que si un miembro no tiene el modificador "const" no puedes usarlo en una función "const".

Y tambien, + tendria que devolver objeto  nuevo mientras que += referencia al objeto?

A ver, el operador "+" tiene que devolver un objeto nuevo porque, como te he comentado antes, este operador no debe modificar la instancia actual. Crear un objeto nuevo responde a la necesidad de devolver el resultado en un objeto que no sea el actual.

El operador "+=" si que tiene que modificar la instancia actual y, dado que al finalizar la función la instancia actual tendrá el valor bueno, suele ser más eficiente devolver una referencia que crear un objeto nuevo basado en el valor actual.

Espero haberte resuelto las dudas.

Un saludo.
En línea

_Enko


Desconectado Desconectado

Mensajes: 538



Ver Perfil WWW
Re: Sobrecarga operador +
« Respuesta #4 en: 6 Febrero 2015, 14:56 pm »

Muchas gracias eferion :D

Me has sacado un monton de dudas y puntos de foco debiles  ;-)


Gracias nuevamente :)

Y pueden dar por cerrado el tema ^^
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda con sobrecarga de operador ( )
Programación C/C++
Akai 6 4,631 Último mensaje 16 Noviembre 2010, 14:53 pm
por Akai
sobrecarga de operador<<
Programación C/C++
adam96 5 4,540 Último mensaje 17 Diciembre 2010, 19:10 pm
por Littlehorse
Problema con la sobrecarga del operador <<
Programación C/C++
Lord_Lobotomi 2 2,405 Último mensaje 5 Diciembre 2011, 19:36 pm
por Lord_Lobotomi
(Consulta) Sobre la sobrecarga del operador &
Programación C/C++
class_OpenGL 4 2,705 Último mensaje 31 Julio 2016, 18:39 pm
por class_OpenGL
C++ Sobrecarga de un operador por medio de un template?
Programación C/C++
GisiNA 7 5,095 Último mensaje 9 Mayo 2017, 06:18 am
por CalgaryCorpus
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines