• Domingo 5 de Mayo de 2024, 07:10

Autor Tema:  sobrecarga del operador - (hacerla const)  (Leído 1817 veces)

lann

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
sobrecarga del operador - (hacerla const)
« en: Lunes 12 de Octubre de 2009, 00:16 »
0
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++
  1.  
  2. static const int HUINTSIZE = 30;
  3. HugeInt HugeInt::operator-( const HugeInt &op2 )//deberia ser const
  4. {
  5.     HugeInt temp;
  6.     for( int i = HUINTSIZE - 1; i >= 0; i-- )
  7.     {
  8.         if( integer[ i ] < op2.integer[ i ] )
  9.         {
  10.             pP( integer, i );
  11.             temp.integer[ i ] = integer[ i ] - op2.integer[ i ];
  12.         }
  13.         else
  14.             temp.integer[ i ] = integer[ i ] - op2.integer[ i ];
  15.     }
  16.     return temp;
  17. }
  18. //funcion utilidad para operator-
  19. void HugeInt::pP( short arr[], const int pos ) //pP (pedirPrestado), deberia ser const
  20. {
  21.     for( int i = pos - 1; i >= 0; i-- )//for1
  22.     {
  23.         if( arr[ i ] > 0 )
  24.         {
  25.             --arr[ i ];
  26.             while( arr[ ++i ] == 0 && ( i != pos ) )
  27.                 arr[ i ] = 9;
  28.  
  29.             arr[ pos ] += 10;
  30.             break;
  31.         }
  32.     }
  33. }// end pP (pedirPrestado) function
  34.  
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

  • Miembro activo
  • **
  • Mensajes: 37
  • Nacionalidad: fr
    • Ver Perfil
    • http://r0d.developpez.com/index-es.php
Re: sobrecarga del operador - (hacerla const)
« Respuesta #1 en: Lunes 12 de Octubre de 2009, 14:51 »
0
Hola,

no se si he entendido bien, pero me parece que solo tienes que poner la función pP en const:
Código: C++
  1. void HugeInt::pP( short arr[], const int pos ) const
  2.  
De lo que veo, pP no modifica nigun dato de la clase HugeInt ¿no?

lann

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: sobrecarga del operador - (hacerla const)
« Respuesta #2 en: Lunes 12 de Octubre de 2009, 20:53 »
0
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

  • Miembro activo
  • **
  • Mensajes: 37
  • Nacionalidad: fr
    • Ver Perfil
    • http://r0d.developpez.com/index-es.php
Re: sobrecarga del operador - (hacerla const)
« Respuesta #3 en: Martes 13 de Octubre de 2009, 00:36 »
0
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
  1. class MiClase
  2. {
  3.     HugeInt HugeInt::operator-( const HugeInt &op2 ) const;
  4. //...
  5. };
  6.  
algo asi:
Código: Text
  1. class MiClase
  2. {
  3.    // a veces ayuda declarar el operador como amigo:
  4.    // friend MiClase operator - ( const MiClase &, const MiClase & );
  5.  
  6.    // ... codigo de MiClase
  7. };
  8.  
  9. MiClase operator - ( const MiClase & left, const MiClase & right )
  10. {
  11.    MiClase resultado; // creación de una nueva instancia de MiClase
  12.    // codigo
  13.    return resultado;
  14. }
  15.  

lann

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: sobrecarga del operador - (hacerla const)
« Respuesta #4 en: Martes 13 de Octubre de 2009, 07:48 »
0
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++
  1. HugeInt HugeInt::operator+( const HugeInt &op2 ) const
  2. {
  3.    HugeInt temp;
  4.    int carry = 0;
  5.  
  6.    for ( int i = ( HUINTSIZE - 1 ); i >= 0; i-- )
  7.    {
  8.       temp.integer[ i ] =
  9.          integer[ i ] + op2.integer[ i ] + carry;
  10.  
  11.      
  12.       if ( temp.integer[ i ] > 9 )
  13.       {
  14.          temp.integer[ i ] %= 10;  //0-9
  15.          carry = 1;
  16.       }
  17.       else
  18.          carry = 0;
  19.    }
  20.    return temp;
  21. }
  22.  

r0d

  • Miembro activo
  • **
  • Mensajes: 37
  • Nacionalidad: fr
    • Ver Perfil
    • http://r0d.developpez.com/index-es.php
Re: sobrecarga del operador - (hacerla const)
« Respuesta #5 en: Martes 13 de Octubre de 2009, 10:20 »
0
Ok ok, me equivoque. Pero hay algo que no entiendo, es la funcion pP:

Código: C++
  1. void HugeInt::pP( short arr[], const int pos ) //pP (pedirPrestado), deberia ser const
  2. {
  3.     for( int i = pos - 1; i >= 0; i-- )//for1
  4.     {
  5.         if( arr[ i ] > 0 )
  6.         {
  7.             --arr[ i ];
  8.             while( arr[ ++i ] == 0 && ( i != pos ) )
  9.                 arr[ i ] = 9;
  10.  
  11.             arr[ pos ] += 10;
  12.             break;
  13.         }
  14.     }
  15. }// end pP (pedirPrestado) function
  16.  

Me dices que:
Cita de: "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.
pP modificar arr, es verdad, pero arr es pasado por parametro, no es miembro de HugeInt. Entonces no entiendo porque pP no puede ser const.

lann

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: sobrecarga del operador - (hacerla const)
« Respuesta #6 en: Martes 13 de Octubre de 2009, 19:36 »
0
linea 10, modifico integer, r0d arr solo es el nombre del argumento de la funcion
Código: C++
  1.              pP( integer, i );
  2.  

r0d

  • Miembro activo
  • **
  • Mensajes: 37
  • Nacionalidad: fr
    • Ver Perfil
    • http://r0d.developpez.com/index-es.php
Re: sobrecarga del operador - (hacerla const)
« Respuesta #7 en: Martes 13 de Octubre de 2009, 20:06 »
0
Vale, pues es lo que dicia desde el principio: el problema es en el operador -, no en la funccion pP.
Solo hay tres posibilidades:
1. declarar la variable miembra integer como mutable, pero eso es mas feo que la hostia.
2. hacer una copia de integer en una variable temporal para enviar a pP()
3. salir el operador - de la clase, como he propuesto en mi secundo mensage. Esto es, de largo, la mejor solucion.

lann

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: sobrecarga del operador - (hacerla const)
« Respuesta #8 en: Miércoles 14 de Octubre de 2009, 04:31 »
0
El problema en mi implementacion es que ninguna de las 2 funciones es const(de hecho el problema si es en las 2 funciones, en pP y en operator-), si una fuera const entonces tambien la otra lo seria, mi humilde opinion sin ofender es que la mejor posibilidad y no esta en las que indicas es rehacer la implementacion de operator- para que no use funciones de utileria (pP) y no modifique sus argumentos. Y r0d pP no es const y no la puedo hacer const si esta modificando su arreglo, asi que pP no podra ser llamada por objetos const no importa que operator- la implemente como una funcion global amiga de la clase HugeInt.