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

Steven Davidson srd4121 en njit.edu
Mar Nov 8 00:35:58 CET 2011


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