L'Option 1 est défectueux. Lorsque vous déclarez un objet
QList<Weight *> ret;
il ne vit que dans la portée locale. Il est détruit lorsque la fonction se termine. Cependant, vous pouvez faire ce travail avec
return ret; // no "&"
Aujourd'hui, bien qu' ret
est détruit, une copie de la première et transmis à l'appelant.
Ceci est généralement préférée à la méthodologie. En fait, la copie et la détruire de l'opération (qui ne sert à rien, vraiment) est généralement élidés, ou optimisé à et vous obtenez un rapide, élégant programme.
Option 2 fonctionne, mais alors vous avez un pointeur sur le tas. Une façon de regarder le C++, c'est que l'usage de la langue est pour éviter le manuel de gestion de la mémoire comme ça. Parfois, vous ne voulez gérer des objets sur le tas, mais l'option 1 permet encore que:
QList<Weight *> *myList = new QList<Weight *>( getWeights() );
où getWeights
est votre exemple de fonction. (Dans ce cas, vous pouvez avoir à définir un constructeur de copie QList::QList( QList const & )
, mais à l'instar de l'exemple précédent, il ne sera probablement pas appelé.)
De même, vous devriez probablement éviter d'avoir une liste de pointeurs. La liste doit stocker directement les objets. Essayez d'utiliser std::list
... pratique avec les possibilités de la langue est plus important que la pratique de la mise en œuvre de structures de données.