PDA

View Full Version : [C++]: Differenza tra list<Item *> e list<Item>


robs05
13-01-2009, 18:17
Salve,

vorrei chiarire un dubbio che differenza c'è tra list<Item *> e list<Item>?

Provo a dare una risposta:

In effetti list<Item> lista dichiaro una lista che può contenere istanze della classe Item. Posso inserire elementi con il metodo lista.push_back()
es.


list<Item> lista;
Item uno(1);
Item due(2);
lista.push_back(uno);
lista.push_back(due);

list<Item>::iterator it = lista.begin();
for(; it != lista.end();it++)
cout << it->getX() << endl;


e questo codice gira.

Invece con list<Item *> lista dichiaro un contenitore che può contenere puntatori a istanze di quella classe quindi


list<Item *> lista;
Item *uno = new Item(1);
Item due(2);
lista.push_back(uno);
lista.push_back(&due);

list<Item *>::iterator it = lista.begin();
for(; it != lista.end();it++)
cout << (*it)->getX() << endl;



e questo codice anche gira!

La mie domande sono:

le affermaizoni che ho fatto sono giuste?
se si qual'è la differenza nell'usare la prima metodologia oppure la seconda?
quando conviene usare la prima o la seconda?
sono scelte implementative? si è liberi di fare come crede o sono legate a qualcosa?

grazie mille

cionci
13-01-2009, 18:58
Item due(2);
lista.push_back(&due);

Questa cosa perde senso se lista esiste anche al di fuori dello scope di due.
Infatti due al di fuori del suo blocco di visibilità può essere anche stata deallocata e sostituita da altri dati. Di conseguenza il puntatore non è più valido.

Il primo tipo di lista usa infatti il costruttore di copia per memorizzare i dati all'interno della lista.

Il secondo tipo è più adatto ad oggetti allocati dinamicamente. Nota che prima di distruggere l'oggetto list devi anche deallocare tutte gli elementi al suo interno.

robs05
13-01-2009, 19:22
invece cosi:


list<Item *> lista;
Item *uno = new Item(1);
Item *due = new Item(2);
lista.push_back(uno);
lista.push_back(due);

list<Item *>::iterator it = lista.begin();
for(; it != lista.end();it++)
cout << (*it)->getX() << endl;


andrebbe bene..... giusto?

invece poi questa scrittura?



list<Item> lista;
Item *uno = new Item(1);
Item due(2);
lista.push_back(*uno);
lista.push_back(due);

list<Item>::iterator it = lista.begin();
for(; it != lista.end();it++)
cout << it->getX() << endl;


ha senso?

cionci
13-01-2009, 19:27
Vanno bene entrambi. Nel primo ovviamente non devi deallocare uno e due, ma devi deallocare gli elementi contenuti nella lista quando la svuoti.