Programación General > C/C++

 sobrecarga del operador - (hacerla const)

(1/2) > >>

lann:
Bueno estoy haciendo una clase HugeInt para almacenar enteros grandes, esta sobrecargado el operador -, pues me funciona la sobrecarga de este modo pero esta sobrecarga no es const y por lo cual no funcionara con objetos HugeInt const, no la hago const por que llama a una funcion que no es const (pP) y esta funcion no es const por que modifica algunos de sus argumentos, ¿alguna idea de como solucionarlo?.


--- Código: C++ --- static const int HUINTSIZE = 30;HugeInt HugeInt::operator-( const HugeInt &op2 )//deberia ser const{    HugeInt temp;    for( int i = HUINTSIZE - 1; i >= 0; i-- )    {        if( integer[ i ] < op2.integer[ i ] )        {            pP( integer, i );            temp.integer[ i ] = integer[ i ] - op2.integer[ i ];        }        else            temp.integer[ i ] = integer[ i ] - op2.integer[ i ];    }    return temp;}//funcion utilidad para operator-void HugeInt::pP( short arr[], const int pos ) //pP (pedirPrestado), deberia ser const{    for( int i = pos - 1; i >= 0; i-- )//for1    {        if( arr[ i ] > 0 )        {            --arr[ i ];            while( arr[ ++i ] == 0 && ( i != pos ) )                arr[ i ] = 9;             arr[ pos ] += 10;            break;        }    }}// end pP (pedirPrestado) function Nota:los numeros en HugeInt se almacenan (internamente) en un array de shorts, el valor mas ala derecha de un numero se almacena en el ultimo elemento el siguiente valor de la izquierda se almacena en el penultimo elemento del array y asi sucesivamente

r0d:
Hola,

no se si he entendido bien, pero me parece que solo tienes que poner la función pP en const:

--- Código: C++ ---void HugeInt::pP( short arr[], const int pos ) const De lo que veo, pP no modifica nigun dato de la clase HugeInt ¿no?

lann:
pP modifica arr asi que no puede ser const, HugeInt operator-( const HugeInt & ) llama a pP asi que  HugeInt operator-( const HugeInt & ) no puede ser const, ahorita tratare de hayar una solucion sin modificar valores que tengo masomenos la idea.

r0d:
Ha vale, ahora entiendo. El problema es la variable integer, que es miembro de HugeInt, y que quieres modificar en el operator -
Lo que tienes que hacer entonces, es salir el operador - de la classe. En vez de:

--- Código: Text ---class MiClase{    HugeInt HugeInt::operator-( const HugeInt &op2 ) const;//...}; algo asi:
--- Código: Text ---class MiClase{   // a veces ayuda declarar el operador como amigo:   // friend MiClase operator - ( const MiClase &, const MiClase & );    // ... codigo de MiClase}; MiClase operator - ( const MiClase & left, const MiClase & right ){   MiClase resultado; // creación de una nueva instancia de MiClase   // codigo   return resultado;} 

lann:
hmmm...
creo que no me entendiste r0d, los objetos constantes solo pueden llamar funciones const( T func() const ), yo no quiero modificar ningun valor (lo cual estoy haciendo), solo quiero regresar un objeto HugeInt temporal para hacer
HU1 = HU3 - HU2, solo HU1 se modificara.
Hacer operator- una funcion miembro global y friend no creo que sea necesario el operador izquiero siempre es un objeto HugeInt

Para que te des una idea la sobrecarga del operador +, no modifica ningun valor y es const (la puedes usar con objetos constantes)


--- Código: C++ ---HugeInt HugeInt::operator+( const HugeInt &op2 ) const{   HugeInt temp;    int carry = 0;    for ( int i = ( HUINTSIZE - 1 ); i >= 0; i-- )   {      temp.integer[ i ] =         integer[ i ] + op2.integer[ i ] + carry;             if ( temp.integer[ i ] > 9 )      {         temp.integer[ i ] %= 10;  //0-9         carry = 1;      }       else          carry = 0;   }    return temp; }  

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa