Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: BlackZeroX en 13 Junio 2011, 09:20 am



Título: [Duda] Sobrecarga de operadores
Publicado por: BlackZeroX en 13 Junio 2011, 09:20 am
Estoy haciendo infinidad de pruebas con estas sobrecargas que me han gustado demasiado a tal grado que veo por que dicen que c es tan potente, pero bueno yendo al punto mi problema surge al momento de sobrecargar el operador "+" y realizo varias sumas de mi clase.

El resultado de la prueba debería de ser:  620 pero me da 20 alguien sabe a que se debe?.

Código
  1.  
  2. class clstest
  3. {
  4.    public:
  5.        clstest();
  6.        virtual ~clstest();
  7.        clstest &operator +( clstest &c1 ) {
  8.            clstest tmp;
  9.            int i = c1;
  10.            tmp = (this->sMsg + i);
  11.            return tmp;
  12.        }
  13.        clstest &operator +( int c1 ) {
  14.            clstest tmp ;
  15.            int a = (this->sMsg + c1);
  16.            tmp = a;
  17.            return tmp;
  18.        }
  19.        clstest &operator = (clstest &c1) {
  20.            if ( this != &c1 ) {
  21.                this->sMsg = c1;
  22.            }
  23.            return *this;
  24.        }
  25.        clstest &operator = (int c1) {
  26.            this->sMsg = c1;
  27.            return *this;
  28.        }
  29.        operator int() {
  30.            return sMsg;
  31.        }
  32.        operator double() {
  33.            return (double)sMsg;
  34.        }
  35.    protected:
  36.    private:
  37.        int sMsg;
  38. };
  39.  
  40. clstest::clstest()
  41. {
  42.    //ctor
  43.    this->sMsg=0;
  44. }
  45.  
  46. clstest::~clstest()
  47. {
  48.    //dtor
  49. }
  50.  
  51. int main()
  52. {
  53.    clstest a;
  54.    a = 45;
  55.    a = a + a + 10;
  56.    a = a + a + 10 + a;
  57.    a = a + a;
  58.    int res = a;
  59.    return 0;
  60. }
  61.  
  62.  

Dulces Lunas!¡.


Título: Re: [Duda] Sobrecarga de operadores
Publicado por: fantasma306 en 13 Junio 2011, 14:35 pm
el fallo esta en lo que devuelven estas dos funciones...
Citar
        clstest &operator +( clstest &c1 ) {
            clstest tmp;
            int i = c1;
            tmp = (this->sMsg + i);
            return tmp;
        }
        clstest &operator +( int c1 ) {
            clstest tmp ;
            int a = (this->sMsg + c1);
            tmp = a;
            return tmp;
        }

el objeto tmp desaparece al terminar la funcion, lo que tienes que devoler es una copia del objeto, y no la referencia a ese objeto ( ya que no existe )

saludos



Título: Re: [Duda] Sobrecarga de operadores
Publicado por: BlackZeroX en 13 Junio 2011, 14:59 pm
Citar

...
4) Ahora el objeto temporal temp se copia a otro objeto temporal sin nombre, y temp es destruido. Y el objeto temporal sin nombre se pasa como parámetro al operador de asignación.
...


http://c.conclase.net/curso/?cap=035b#037_punteros

lo curioso es que solo funciona el código de esta manera:

a = a + a

pero si agrego mas sumando's a la expresión valen chocho.

Dulces Lunas!¡.


Título: Re: [Duda] Sobrecarga de operadores
Publicado por: fantasma306 en 13 Junio 2011, 15:24 pm

conforme tu lo has puesto, esas funciones estan devolviendo la direccion de TMP (con el &), lo que pasa que TMP a sido destruido... que hay en esas direcciones?? (basura)

si quitas el "&" (que has puesto en el tipo de retorno) estaras devolviendo la copia del objeto a otro objeto temporal sin nombre como dice en la pagina.


(algo que seguro que no necesitas que te lo diga, seguro que ya lo sabes)
es lo mismo que pasa con los parametros por referencia y los parametros por valor
si pones el "&" estaras pasando la direccion de la variable... y si no pones el & se creara una copia temporal de la variable


Título: Re: [Duda] Sobrecarga de operadores
Publicado por: BlackZeroX en 13 Junio 2011, 20:55 pm
.
soy un nesio xP gracias, me hiciste revisar nuevamente la pagina.

Dulces Lunas!¡.