12/09/2006, 17:54
|
| | Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 8 meses Puntos: 17 | |
La verdad, no tiene sentido agregar datos a una variable de esa manera.
--
A la solución de Nivel7 con "union": Bien, pero no has contado con varias cosas:
1. Algunos datos son punteros. No estás asignándoles memoria.
2. Cada vez que Asignes, copies, o lo que sea, otra vez lo mismo: A liberar memoria, crear nueva...
--
A la solución con una super estructura, lo mismo, y además:
1. La estructura sería inmensa.
2. Para crear un dato, pasas un void*. Entonces, cuando llames a la función Crear, tendrías que diferenciar entre no punteros y punteros. Es decir, el ejemplo que has puesto, no vale:
int laEdad;
edad = Crear(INT, laEdad); // Adiós!
Si el compilador no te avisa... pum! Leerás 4 bytes de memoria cuyo offset sea "laEdad".
--
Y a ambas:
¿Qué pasa si es un float a un int? ¿O cadena a char? ... etc. Te toca, para cada operador, definir todas las combinaciones posibles. Además, muy lento.
--
La solución "a la C++" es mejor, sería lo mismo que haber usado funciones virtuales. Pero para eso solución se implementan macros que crean las estructuras, es decir:
#define newint(nombre) var nombre = { nullvar, crearint, sumarint, ... };
o mejor, creando un array de cada operador para cada tipo y luego asignando
#define newvar(tipo,nombre) var nombre = { nullvar, crear[tipo], sumar[tipo], ... };
Aunque eso de: "en C++ esto seria mas facil ya que hay sobrecarga de operadores, en C, no."
En C++ existen las clases, herencia, funciones virtuales y templates; que fundamentalmente manejan todo esto. ;) |