1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| #include <string>
#include <set>
#include <boost/foreach.hpp>
/*
La POO est souvent enseignée à l'aide de contre-exemples. Les hiérarchies
d'employés de banque sont typiquement le genre de chose qui ne gagnent
pas grand chose à être transformées en objets car ce ne sont que de pures
données la plupart du temps. Rendre les attributs privés pour ensuite les
accompagner de getter / setter n'apporte rien dans le cas présent. Autant
en faire des structures transparentes.
*/
struct Person
{
/*
En l'absence de plus d'informations, c'est ici un string et non un simple
"const char *" à la durée de vie indéfinie (ce peut être une constante
tout comme une chaîne temporaire construite dynamiquement).
*/
std::string name;
int age;
};
/*
Le nommage des types (et encore plus des variables) ne doit pas
s'encombrer de détails d'implémentation sans intérêts. Le terme "liste
d'amis" est toutefois courant (p. ex. "ma liste d'amis sur FaceBook"
contrairement à "Tiens, bonjour, je te présente ma collection d'amis...").
D'ailleurs, en terme d'implémentation, c'est un set qui est utilisé.
*/
struct FriendList
{
/*
Même remarque qu'au dessus.
*/
std::string name;
/*
Pluriel de "friend" et non un truc du genre "friendList". En l'occurence,
c'est un "set" afin de garantir à peu de frais (sans devoir écrire de
add/removePerson) qu'on n'aura pas de doublons.
Quant au type des éléments, il s'agit naturellement de pointeurs car une
liste d'amis référence des personnes qui vivent leur vie indépendamment
des différentes listes d'amis qui peuvent pointer vers eux. Plus
fondamentalement, c'est l'identité des amis qu'on veut stocker et non leur
valeur (nom, sexe, couleurs des yeux, etc.). Si on avait voulu stocker
l'historique des abonnements de personnes à cette liste, c'est par contre
un stockaga par valeur qui aurait prévalu, permettant de savoir, par
exemple, que la première fois où une personne s'est abonnée, elle avait
75 ans et 95 ans la deuxième fois.
*/
std::set< Person * > friends;
};
using namespace std;
int main( int, char ** )
{
Person persons[] = {
{ "François", 13 },
{ "Mick", 11 },
{ "Annie", 10 },
{ "Claude", 11 },
{ "Dagobert" }
};
FriendList club = { "Le club des 5" };
for (size_t i = 0; i < 5; ++i) {
club.friends.insert( &persons[i] ); // c. à d. &( persons[i] )
}
cout << club.name << " contient " << club.friends.size() << " amis :" << endl;
for (set< Person * >::const_iterator itr = club.friends.begin(), endItr = club.friends.end(); itr != endItr; ++itr) {
cout << '\t' << (*itr)->name << endl;
}
/*
Variante utilisant la bibliothèque Boost pour plus de lisibilité.
*/
cout << club.name << " contient " << club.friends.size() << " amis :" << endl;
BOOST_FOREACH (const Person * pFriend, club.friends) {
cout << '\t' << pFriend->name << endl;
}
return EXIT_SUCCESS;
} |
Partager