[C con Clase] lista abierta con datos de distinto tipo

Jorge Pozo jorgepozo en conclase.net
Mar Nov 8 08:44:04 CET 2011


Perfecto. Muchas gracias,

Jorge


> Hola Jorge,

> 2011/11/7 Jorge Pozo <jorgepozo en conclase.net>:
>> Hola,
>>
>> primer post... :P
>>

> Bienvenido a la lista :)

>>

> [CORTE]

>> Mi  pregunta  es cómo hacer una lista que pueda contener tanto objetos
>> de  A  como de C. Así podría hacer un sólo tipo de nodo y un sólo tipo
>> de lista, con sus métodos disponibles tanto para C como para D.
>>
>> Se me ocurren 2 opciones:
>>   -que  los  nodos  tengan  hueco para un puntero a un objeto de cada
>>   clase, y que vayan todos vacíos menos uno.
>>   -usar una estructura de tipo 'union' para los nodos... aunque no se
>>   si sabría hacer esto, la verdad :P
>> Supongo  que seria lo mismo que un árbol en el que cada hoja pudiera ser
>> de un tipo.
>> Seguramente  mi problema es mas de enfoque general que otra cosa, pero
>> bueno....
>>

> Bueno, según he entendido, personalmente creo que la mejor solución es
> implementando plantillas (templates, en inglés) para las clases. Si
> creas un nodo genérico, entonces puedes indicar cualquier tipo de
> dato. Por ejemplo,

> template< typename T >
> struct nodo
> {
>   T valor;
>   nodo< T > *pSig;
> };

> Ahora puedes crear y usar cualquier nodo de cualquier tipo. Por ejemplo,

> nodo< A >
> nodo< B >

> Las clases que representan listas dinámicamente enlazadas también
> pueden ser plantillas; por ejemplo,

> template< typename T >
> class Lista
> {
> private:
>   nodo< T > *pPrimero;

> public:
>   ...
> };

> Así podemos crear listas de listas de listas de ... algo. Por ejemplo,

> Lista< Lista< Lista< A > > > listaListaListaA;

> que internamente usará y creará nodos de listas.

> Deberías consultar el ejemplo final del capítulo 1 del curso de EDD,
> ya que usa plantillas. El enlace es:
> http://c.conclase.net/edd/index.php?cap=001h#1_11


> También puedes optar por derivar las clases 'C' y 'D' de la
> clase-plantilla 'Lista', por si necesitas realizar diferentes
> operaciones o diferentes comportamientos. Por ejemplo,

> class C : public Lista< A >   { ... };
> class D : public Lista< B >   { ... };


> Espero que esto te oriente.

> Steven

> _______________________________________________





Más información sobre la lista de distribución Cconclase