#include "Artisan.h" // Qui inclut lui même Personne.h !
#include <iostream>  // Pour les entrées sorties.

#include <list>      // Normalement, Personne.h, inclus par Artisan.h,
		     // inclut déjà ce fichier. Mais vu que j'ai
		     // besoin des listes ici, je le mets, sans faire
		     // confiance à d'autres inclusions. On voit
		     // l'intérêt de "verrouiller" les .h pour que
		     // seule leur première inclusion soit effective.
#include <string>    // Idem.

int main(int argc, char* argv[]) // Copiez bêtement...
{

  Artisan* toto;
  std::list<std::string*>           attributs; // Liste vide, ce n'est pas une référence.
  std::list<std::string*>::iterator iter;      // De quoi parcourir la liste
  std::string* attribut_courant;

  toto = new Artisan("Dupont", "Jean", "Plombier");
  toto->ListeAttributs(attributs);

  // On affiche la liste à l'écran, c'est-à-dire sur std::cout.
  for(iter  = attributs.begin();
      iter != attributs.end();
      iter++)
    {
      // Quand on a une std::list<T>, *iter est de type T, donc chez
      // nous, *iter est de type std::string*.
      attribut_courant = *iter;
      
      // Les opérateurs marchent avec des std::string&, d'où l'étoile
      // (cf mon tutorial).
      std::cout << *attribut_courant 
		<< std::endl; // Retour à la ligne.
    }
  
  // La liste est détruite en fin de fonction, ce n'est pas une
  // référence. Mais ce qui est détruit, c'est les trucs alloués pour
  // la gérer (les chainons). Les éléments, vu qu'ils sont des
  // références, doivent être préalablement détruits à la main.
  for(iter  = attributs.begin();
      iter != attributs.end();
      iter++)
    delete *iter;
  
  // destruction implicite de la structure de liste.

  return 0; // retournez 0 si tout s'est bien passé.
}