Connexion :

Recherche

  
   Tout| Actus| Télécharger| Comparateur de prix| Dossiers| Forums| Jeux| Google

16 messages
ok

{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é:


# // AFFICHER
# // Affiche tous les éléments de MaListe
# void afficher()
# {
# std::cout << "***" << std::endl;
# if(!MaListe.empty())
# {
# std::list<int>::iterator IterateurListe; // Construction d'un itérateur pour parcourir les éléments de la liste
# for(IterateurListe=MaListe.begin();IterateurListe!=MaListe.end();IterateurListe++)
# {
# std::cout << "Valeur de l'iterateur : " << (*IterateurListe) << std::endl; // L'itérateur est un pointeur sur un élément de la liste. Pour avoir son contenu il faut donc mettre la petite étoile devant.
# }
#
# }
# else
# {
# std::cout << "La liste est vide" << std::endl;
# }
# std::cout << "***" << std::endl;
# }



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.








#include "test.hpp"
#include <list>
#include <iostream>

int main()
{
Test().run();
return 0;
}



void Test::run()
{
int i;
char c;

std::cin >> i;
std::cin >> c;

Test(i,c);
sesTest.push_back(new Test(i,c));
std::list<Test*>::const_iterator it;
it=sesTest.begin();
std::cout << (*it) << std::endl;

int aten;
std::cin >> aten;
}

Test::Test()
{}


Test::Test(int leInt, char leChar):sonInt(leInt), sonChar(leChar)
{}


Voilà et ça m'affiche 0x804b050
Edité le 13/03/2008 à 14:11
 
 
Pas étonnant.

Si tu essayes avec std::list<Test>, ç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:
Code :
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 :)

ie: std::list<Vin> 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
std::list<Vin*> sesVins
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 << :)
 
 
C'est déjà fais, mais mal apparement...

Code :
# 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:

Code :
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.
 
 
 
16 messages
ok
 
Vous devez être connecté pour écrire un message !
 

 Sujets Similaires:


 
Clubic.com
 
Achetez-facile.com
 
Jeuxvideo.fr
 
neteco.com
 
mobinaute.com