{C++} Afficher le contenu d'une std::list

Salut, je ne trouve pas comment afficher le contenu d’une std::list, comment faut il faire? j’ai essayer avec un std::cout << (*it) mais ça marche pas.

J’aurais aussi une deuxième question au passage car je suis pas sur de mon coup. Je voudrais stocker des informations concernant des vins (d’une classe Vin) . Les informations à stocker sont le nom, l’année de mise en bouteille, la quantité. Est ce que je dois utiliser std::list pour sauvegarder mes données ou dois-je utiliser autre chose? (sachant que je n’ai vu que les set, map, list, et vector)

cimer!

EDIT: pour ma 1ere question je crois que j’ai trouvé:

est ce bien ça? Car moi je fais la même chose et ça marche pas
Edité le 13/03/2008 à 13:23

Bon je viens de réessayer et ça marche pas.

Voilà et ça m’affiche 0x804b050
Edité le 13/03/2008 à 14:11

Pas étonnant.

Si tu essayes avec std::list, ça marchera si tu as cet opérateur:

iostream& operator<<( iostream& out, Test& test);

(note: je sais plus si y en a pas un autre, associé à l’objet, sinon faut utiliser une méthode amie je crois)

Pour ce que tu veux, faut faire : std::cout << *(*it) << std::endl; où là il fera appel à l’opérateur.

Merci, et sinon est ce que c’est le bon choix d’utiliser une std::list? (rappel: c’est pour stocké les caractéristiques de vins, donc lors de l’affichage des données stockées, je dois voir une liste avec les noms des vins enregistrés suivi de leur caracteristiques)

Bah, c’est un container, donc oui.

Maintenant un set serait peut-être plus adaptés, puisque tu as un ensemble de vins distincts, … mais ce n’est pas forcé.

Mais un set ne peut contenir qu’un seul type d’info non ? Alors que dans une list je peut mettre des strings, des chars, des int… Je me trompe ?

Non. Dans une liste tu ne mets pas n’importe quoi. Tu mets des objets de même type, ou des objets qui héritent du type du contenu de la liste.

ie:

class A {}
class B : A {}
class C : A {}
class D {}

std::list<A*> foobar;
foobar.add(new B()); // ok
foobar.add(new C()); // ok
foobar.add(new D()); // NON

Si tu mets n’importe quoi, tu ne sais pas ce que tu extrais (rien ne distingue un pointeur sur un char, d’un entier, etc).

En ce sens, set & list c’est le même combat; Sauf que le set assure l’unicité des éléments.

Donc si je veux insérer un constructeur Vin(std::string sonNom, std::string sonAnnee, int saQt, Couleur saCouleur, Cru sonCru) dans ma list c’est pas bon ?

Tu n’insère pas un constructeur, mais un objet de type Vin :slight_smile:

ie: std::list ou std::list<Vin*>.

Faut voir d’où viennent tes vins pour savoir si le pointeur est mieux que sans

J’ai une classe Vin et j’ai mis [quote=""]
std::list<Vin*> sesVins
[/quote]
dans ses données membres. Et je me sert du constructeur surchargé de la classe Vin pour créer un objet de type Vin. Par contre certain de ses attributs viennent d’autres classes (comme la couleur par exemple).
Voilà je sais pas si ça répond à ta question.

Ca n’est pas un problème.

Si tu veux, imagines ça (le code doit être faux, ça fait longtemps que j’ai pas fait de C++):

class Alcool {
public: const Color color; const double degree;
}
class Vodka : Alcool {}
class Vin : Alcool {}

std::list<Vin*> pinards = …;
(*pinards.begin())->getColor();
(*pinards.begin())->getDegree();

Ca c’est bon. Car tu as une liste de vin, dans laquelle tu ne fous que des vins!

Par contre:

Alcool* a = new Vodka();
pinards.add(const_cast(Vin*)a);

(*pinards.rbegin())->getColor();
(*pinards.rbegin())->getDegree();

Ca, c’est faux. Car tu ajoute dans ta liste de la vodka, alors que c’est du vin.

C’est tout.

Bon, sur un autre forum on m’a conseiller d’utiliser un vector plutôt qu’une list. Mais c’est le même problème, je sais pas afficher le contenu d’un vector quand ce contenu est un objet Vin…

Parce qu’il faut surcharger/déclarer l’opérateur << :slight_smile:

C’est déjà fais, mais mal apparement…

# std::ostream & operator <<(std::ostream & os, Vin & l)
# {
#         os << l.sonNom << ' ' << l.sonAnnee << '\n';
#         return os;
# }

Ouais, mais en l’occurrence tu ne stocke pas des Vin, mais des Vin*

Essaye ça:

std::ostream & operator <<(std::ostream & os, Vin* l)  {
  return os << l->sonNom << ' ' << l->sonAnnee << endl;
}

Ok j’essaierai, j’ai pas mon pc sous la main là.

Merci de ton aide en tous cas.