Lista de objetos

5erg10
14 de Agosto del 2003
Tengo una dudilla sobre la creación de un numero aleatorio de objetos dentro de un bucle. Vereis, tengo un archivo con unos datos a partir de los cuales kiero crear objetos y meterlos en una lista hecha con punteros. Entonces tengo lo siguiente:

while(!fentrada.eof())
{
/*
Akí leo los datos
*/
objeto ob( /*uso los datos leidos*/ );
anadir(lista, ob);
}

La funcion 'anadir' tiene el siguiente cuerpo (añade siempre los objetos al principio de la lista):

void anadir(objeto * &l, objeto &elem)
{
objeto.sig = l; // objeto.sig es un puntero
// a otro objeto
l = &elem;
}

Bueno, pues la cosa es ke en el bucle de arriba, en el ke creo los objetos, éstos siempre reciben la misma dirección de memoria, con lo ke el resultado final es una lista de un solo objeto apuntandose a sí mismo.

Lo he conseguido arreglar creando un array de objetos en el que voy metiendo los objetos creados en posiciones sucesivas, y luego al final lo recorro y creo la lista; pero la cosa es ke así ya me fijo un número máximo de objetos ke puedo crear (para darle dimension al array) y eso es lo ke no kiero.

¿Alguien podría decirme alguna solución más 'elegante' a mi problema?

Muchas gracias por adelantado.

chuidiang
14 de Agosto del 2003
Veo dos cosas raras.

La primera es que declaras objeto dentro de las llaves del while, con lo que es local. En cuanto te salgas de esa iteración, esa instancia desaparece. En la siguiente iteración se crea otra, pero quizas el compilador la ponga en la misma dirección de memoria, que ya está libre. Por eso es posible que siempre te salga la misma dirección.

La segunda es que a anadir() le pasas una referencia objeto &elem (no un puntero, que seria objeto *elem) y guardas la dirección de eso. Como elemento era local a la iteración, ese puntero dejará de tener sentido cuando salgas de dicha iteración. Al final tu lista quedará con puteros más o menos desmadrados.

Prueba lo siguiente:

Dentro del while declara

objeto *obj;
obj = new objeto (...);

Al anadir() pasale el puntero

void anadir (ojbeto * &l, objeto *elem) { ... }

Con esto debería valer. Eso sí, debes liberar los elementos de la lista cuando ya no te hagan falta.

Se bueno.

5erg10
14 de Agosto del 2003
Muchas gracias, chuidiang. La cosa es ke no me hacía a la idea de ke había variables locales en los bucles, creía ke solo pasaba en las funciones.

Un saludo ;)

chuidiang
14 de Agosto del 2003
€n general, cualquier variable es local al bloque entre llaves, sea función, bucle, if, o incluso nada. Por ejemplo, puedes hacer esto

void funcion()
{
printf ("Hola tun");
{ /* bloque de llaves dentro del codigo, a pelo */
int b;
b=4;
}
printf ("%dn", b); /* Error. b es local a las llaves. */
}

Se bueno.