[Duda] Sobrecarga de operadores

Iniciado por BlackZeroX, 13 Junio 2011, 09:20 AM

0 Miembros y 1 Visitante están viendo este tema.

BlackZeroX

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 (cpp) [Seleccionar]


class clstest
{
    public:
        clstest();
        virtual ~clstest();
        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;
        }
        clstest &operator = (clstest &c1) {
            if ( this != &c1 ) {
                this->sMsg = c1;
            }
            return *this;
        }
        clstest &operator = (int c1) {
            this->sMsg = c1;
            return *this;
        }
        operator int() {
            return sMsg;
        }
        operator double() {
            return (double)sMsg;
        }
    protected:
    private:
        int sMsg;
};

clstest::clstest()
{
    //ctor
    this->sMsg=0;
}

clstest::~clstest()
{
    //dtor
}

int main()
{
    clstest a;
    a = 45;
    a = a + a + 10;
    a = a + a + 10 + a;
    a = a + a;
    int res = a;
    return 0;
}



Dulces Lunas!¡.
The Dark Shadow is my passion.

fantasma306

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

Es mejor callar y que piensen que eres idiota a hablar y demostrarlo.

BlackZeroX

#2
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!¡.
The Dark Shadow is my passion.

fantasma306


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
Es mejor callar y que piensen que eres idiota a hablar y demostrarlo.

BlackZeroX

.
soy un nesio xP gracias, me hiciste revisar nuevamente la pagina.

Dulces Lunas!¡.
The Dark Shadow is my passion.