Lista de objetos
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.
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.
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.
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.
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 ;)
Un saludo ;)
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.
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.
