|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jan 2007
Messaggi: 112
|
[C++]: Differenza tra list<Item *> e list<Item>
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. Codice:
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;
Invece con list<Item *> lista dichiaro un contenitore che può contenere puntatori a istanze di quella classe quindi Codice:
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;
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 |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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. |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Jan 2007
Messaggi: 112
|
invece cosi:
Codice:
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;
invece poi questa scrittura? Codice:
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;
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Vanno bene entrambi. Nel primo ovviamente non devi deallocare uno e due, ma devi deallocare gli elementi contenuti nella lista quando la svuoti.
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:21.



















