[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