![]() |
| | ||||
| ||||
| |
| |||
| "R.G.A.M." <rgam1989***yahoo.com.ar> writes: > Me gustaría saber cómo puedo diseñar un objeto de la misma naturaleza > que la clase "int", salvo que sólo abarque los números del 0 al 9, > para poder trabajar únicamente con dígitos, sin derrochar memoria. > > Desde ya, muchas gracias. Tipos enteros y objetos no son de la misma naturaleza en C++. No se puede escribir: 42.print(); typedef unsigned char digit; // misma naturaleza o bien: class digit { // un objeto protected: unsigned char value; digit(unsigned char aValue):value(aValue){assert((0<=aValue)&(aValue<= 9));} inline int getValue(void)const{return value;} const digit& operator+(const digit& other){return(digit((value+other.getValue())%10)); } // ... }; -- __Pascal Bourguignon__ |
| |||
| On Thu, 1 May 2008 16:25:02 -0700 (PDT), "R.G.A.M." <rgam1989***yahoo.com.ar> wrote: >Me gustaría saber cómo puedo diseñar un objeto de la misma naturaleza >que la clase "int", salvo que sólo abarque los números del 0 al 9, >para poder trabajar únicamente con dígitos, sin derrochar memoria. > Podrías usar un enumerado: enum digito {CERO,UNO,TRES,CUATRO,CINCO,SEIS,SIETE,OCHO,NUEVE} ; Eso garantiza que el compilador aplicará cuantas optimizaciones considere necesarias en cuanto a tamaño del dato y tamaño del código que crea necesarias, en función de la sopciones de compilación. Pero recuerda: No se realiza en ningún monento la comprobación de rango. Si quieres que el rango semantenga, puedes sobrecargar los operadores, por ejemplo: digito operator+(const digito primero, const digito segundo) { int suma=static_cast<int>(primero)+static_cast<int>(se gundo); return static_cast<diigto>(suma%10); } saludos, Zara |
| |||
| On 5 mayo, 02:43, Zara <me_z...***dea.spamcon.org> wrote: > On Thu, 1 May 2008 16:25:02 -0700 (PDT), "R.G.A.M." > > <rgam1...***yahoo.com.ar> wrote: > >Me gustaría saber cómo puedo diseñar un objeto de la misma naturaleza > >que la clase "int", salvo que sólo abarque los números del 0 al 9, > >para poder trabajar únicamente con dígitos, sin derrochar memoria. > > Podrías usar un enumerado: > > enum digito {CERO,UNO,TRES,CUATRO,CINCO,SEIS,SIETE,OCHO,NUEVE} ; > > Eso garantiza que el compilador aplicará cuantas optimizaciones > considere necesarias en cuanto a tamaño del dato y tamaño del código > que crea necesarias, en función de la sopciones de compilación. > > Pero recuerda: No se realiza en ningún monento la comprobación de > rango. Si quieres que el rango semantenga, puedes sobrecargar los > operadores, por ejemplo: > > digito operator+(const digito primero, const digito segundo) { > int suma=static_cast<int>(primero)+static_cast<int>(se gundo); > return static_cast<diigto>(suma%10); > > } > > saludos, > > Zara Muchas gracias por tu respuesta, Zara. La tuya me ayudó a aclarar la duda que tenía. Me veía tentado a usar algún enumerado, pero me temía que ocupara la misma memoria que el entero, y simplemente asignara nombres a algunos particulares. Agradezco también la corrección de Pascal. Desde la próxima, tendré más cuidado con los conceptos que menciono. |
| |
| |
![]() |
| Herramientas | |
| Desplegado | |
| |