Newsgroup: it.comp.lang.c++
Titolo: Funzione che ritorna una lista di puntatori ad oggetti

Salve ha tutti,
ho la necessità di creare una funzione che mi ritorni una lista di puntatori
ad oggetti da me creati. Quello che pensavo è il seguente codice:
........
std::list<My_Class *> pMy_Class; // Lista contenente dei puntatori a vari
oggetti della mia classe
..........
std::list<My_class*> *getObjectCadList() { // Ecco la funzione
    return &pMy_Class;
}
...............
Il compilatore non mi dà alcun errore o warning. Secondo voi questo codice è
esatto ?
Grazie.
Simone

 esatto ?
il codice in se è esatto, però potresti valutare anche la possibilità di
restuituire una copia della lista, piuttosto che un puntatore ad essa. In
generale è sempre meglio evitare di utilizzare raw pointer, se non altro
cerca di limitarli.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 grazie
un semplice puntatore nudo e crudo. Generalmente è meglio ricorrere a
classi che incapsulano il concetto di puntatore, come auto_ptr della
libreria C++ e quelli della libreria boost (vedi 
http://www.boost.org
).


 cerca di limitarli.
Restituisco la lista, perchè devo lavorare sui dati originali e non sulla
loro copia.
Puoi spiegarmi cosa significa l'espresisone raw pointer ?
grazie
Simone

Riprendo il codice di prima:
std::list<My_class*> *getObjectCadList() { // Ecco la funzione
    return &pMy_Class;
}
...............
listReturned = getObjectCadList(); // listReturned deve essere un puntatore
Dopo aver restituito il puntatore alla lista, creo un iteratore per
navigarci dentro:
....
std::list<My_class*>::iterator iteratorMy_Class;
.......
Se voglio ad esempio accedere dall'inizio della lista, dovrei fare:
.........
iteratorMy_Class = listReturned.begin()
..........
Questo però non lo posso fare perchè listReturned non è una lista effettiva,
ma solo un puntatore.
Infatti il compilatore non compila il codice.
Io devo per forza restituire la lista per indirizzo, altrimenti all'uscita
del blocco dove la creo, essa viene distrutta e perdo i dati.
Hai forse una soluzione da propormi ?
Grazie per l'aiuto
Simone


Devi semplicemente fare:
iteratorMy_Class = listReturned->begin();
Maurus

 ha scritto nel messaggio
news:b06jio$ls4o0$1...@ID-125555.news.dfncis.de...

HAI RAGIONE........:-)))
Quando si lavora troppo....................
Siccome nella mia lista ci sono puntatori ad oggetti e non oggetti stessi,
per accedere alle funzioni membro posso utilizzare il solito metodo
.........
listReturned->my_func_membro(); // esempio
.......
oppure devo accedere alle funzioni membro in una maniera particolare
Grazie.
Simone


Puoi fare qualcosa del genere:
   std::list<My_class*>::iterator itMy_Class;
   std::list<My_class*>::iterator itMy_ClassEnd;
   itMy_Class = listReturned->begin();
   itMy_ClassEnd = listReturned->end();
   for ( ; itMy_Class != itMy_ClassEnd; itMy_Class ++)
      (*itMy_Class)->my_func_membro();
Ovviamente la funzione membro deve essere pubblica.
Nel caso vuoi accedere non iterativamente a tutte le funzioni della lista
devi usare i metodi che ti offre <list>
, magari ancora usando gli iteratori ma senza il for.
Maurus

 Maurus
Grazie Maurus sei stato un aiuto prezioso.
Simone


Avrei ancora una domanda.
Per distruggere gli oggetti puntati dalla mia lista di puntatori io avrei
pensato a questo codice:
.........
std::list<My_Class *> *pMy_Class; // sempre il puntatore alla mia lista
std::list<My_Class *>::iterator my_ClassIterator; // sempre l'iteratore per
la lista
.......
my_ClassIterator = pMy_Class->begin(); // Punto all'inizio della lista
 while(my_ClassIterator != pMy_Class->end()) {
  delete (*my_ClassIterator); // Rilascio la memoria puntata da ogni singolo
puntatore
  my_ClassIterator++; // Passo al prossimo oggetto
 }
Poi quando esco dal blocco di codice, verrà distrutta la lista di puntatori.
In teoria dovrei aver rilasciato tutta la memoria. Giusto ?
Grazie
Simone

 std::list<My_Class *> *pMy_Class; // sempre il puntatore alla mia lista
dovrai assegnare a pMy_Class l'indirizzo della lista cosi':
pMy_Class = getObjectCadList();
altrimenti lavori con un puntatore non inizializzato.
Giustamente come dici tu, poi alla fine del blocco la lista sara' distrutta
automaticamente.
Maurus