Ver Mensaje Individual
  #11 (permalink)  
Antiguo 12/09/2006, 17:54
MaxExtreme
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 1 mes
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. ;)