Bonsoir, après avoir perdu la raison et fini à l’asile, j’ai enfin compris comment implémenter tout ça et surtout j’ai appris beaucoup de choses (Grâce à vous les gars !)
En re-lisant mes posts, je me rend-compte maintenant de la stupidité de certaines déclarations >_<
J’ai compris comment utiliser ces satanés collections hétérogènes, enfin !
Et j’ai amélioré la conception de mon programme au passage, car la POO c’est cool mais penser en OO quand on vient du C, bah ’C’ la galère, HAHAHahaha… Pardon.
Le truc qui m’a rendu fou en fait c’est que je cherchais à initialiser un truc qui ne peut pas l’être
Bah oui, un std::vector
de pointeur unique std::unique_ptr
est non copiable (Comparé à un vector de pointeurs partagé std::shared_ptr
). Donc le constructeur n’a rien à faire là-dedans, j’ai simplement déclaré un std::vector
de type std::unique_ptr
en tant que membre private:
de la classe Aquarium
et quand j’en ai eu besoin dans ma fonction membre pour ajouter un animal de la classe abstraite Animal
(Dont dérive une classe Poisson
) bah j’utilise .push_back(std::make_unique<Poisson>());
, tout simplement !
Olybri m’avait mis la réponse sous les yeux, mais le temps que je comprenne le pricipe…
Donc du coup je vous met le programme ici. Il y a sûrement des choses à améliorer comme la vérification de saisie dans la fonction membre voir()
de la classe Aquarium
Parce que si l’on rentre autre chose que un int
, la boucle est infinie
Et au lieu d’avoir un vieux switch()
et de devoir faire des .push_back()
dans le constructeur de la classe Aquarium
pour définir les valeur possibles, je pourrai mettre ça dans un fichier et initialiser les std::vector
contenant les seules possibilités offertes avec ce qu’il y a dans le fichier, comme ça on ne touchera pas au code pour pouvoir ajouter des races d’animaux par la suite.
Mais c’était juste pour voir si j’avais bien compris le tout et que j’implémentai ça correctement.
aquarium.h
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 | #ifndef AQUARIUM_H
#define AQUARIUM_H
#include <vector>
#include <memory>
#include <string>
#include "animal.h"
class Aquarium
{
private:
// Membres privés
int m_cycle; // Cycle en cours
std::vector<std::string> m_liste_possible_animaux;
std::vector<std::string> m_liste_possible_vegetaux;
std::vector<char> m_liste_possible_sexes_animaux;
std::vector<std::string> m_liste_possible_regimes_animaux;
std::vector<std::unique_ptr<anx::Animal::Animal> > m_animaux; // Collection d'animaux (Poissons, Crustacés, etc...)
//std::vector<std::unique_ptr<Vegetal> > m_vegetaux; // Collection de végétaux (Algues, coraux, etc...)
public:
// Ensemble Constructeur/Destructeur
Aquarium();
// Fonctions membres
void ajouterAnimal();
void ajouterVegetal();
void voir();
void nouveauCycle();
};
#endif
|
aquarium.cpp
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157 | // Headers C++
#include <iostream>
#include <string>
// Header de la classe
#include "aquarium.h"
// Corps de la classe
Aquarium::Aquarium()
{
m_cycle = 0;
m_liste_possible_animaux.push_back("Poisson");
m_liste_possible_regimes_animaux.push_back("Carnivore");
m_liste_possible_regimes_animaux.push_back("Herbivore");
m_liste_possible_sexes_animaux.push_back('M');
m_liste_possible_sexes_animaux.push_back('F');
}
void Aquarium::ajouterAnimal()
{
// Choix du type d'animal
std::cout << "Choisissez le type d'animal à ajouter dans l'aquarium (Entrez le numéro) : " << std::endl;
for(std::size_t i {0} ; i < m_liste_possible_animaux.size() ; ++i)
{
std::cout << i << " : " << m_liste_possible_animaux[i] << std::endl;
}
std::cout << ">> ";
int choix {0}, n_race {0};
while(!(std::cin >> choix) && choix > static_cast<int>(m_liste_possible_animaux.size()))
{
std::cerr << "La saisie n\'est pas valide !" << std::endl;
}
std::string race {m_liste_possible_animaux[choix]};
n_race = choix;
// Saisie de l'espèce
std::cout << "Entrez l\'espèce de l\'animal : " << std::endl;
std::cout << ">> ";
std::string entree {""};
while(!(std::cin >> entree))
{
std::cerr << "La saisie n\'est pas valide !" << std::endl;
}
std::string espece {entree};
// Choix du type de régime alimentaire
std::cout << "Choisissez le régime alimentaire de l\'animal (Entrez le numéro) : " << std::endl;
for(std::size_t i {0} ; i < m_liste_possible_regimes_animaux.size() ; ++i)
{
std::cout << i << " : " << m_liste_possible_regimes_animaux[i] << std::endl;
}
std::cout << ">> ";
choix = 0;
while(!(std::cin >> choix) && choix > static_cast<int>(m_liste_possible_regimes_animaux.size()))
{
std::cerr << "La saisie n\'est pas valide !" << std::endl;
}
std::string regime {m_liste_possible_regimes_animaux[choix]};
// Choix du sexe
std::cout << "Choisissez le sexe de l\'animal (Entrez le numéro) : " << std::endl;
for(std::size_t i {0} ; i < m_liste_possible_sexes_animaux.size() ; ++i)
{
std::cout << i << " : " << m_liste_possible_sexes_animaux[i] << std::endl;
}
std::cout << ">> ";
choix = 0;
while(!(std::cin >> choix) && choix > static_cast<int>(m_liste_possible_sexes_animaux.size()))
{
std::cerr << "La saisie n\'est pas valide !" << std::endl;
}
char sexe {m_liste_possible_sexes_animaux[choix]};
// Saisie du nom
std::cout << "Entrez le nom de l\'animal : " << std::endl;
std::cout << ">> ";
entree = "";
while(!(std::cin >> entree))
{
std::cerr << "La saisie n\'est pas valide !" << std::endl;
}
std::string nom {entree};
// Saisie de l'âge
std::cout << "Entrez l\'âge de l\'animal (0 pour un nouveau-né) : " << std::endl;
std::cout << ">> ";
choix = 0;
while(!(std::cin >> choix))
{
std::cerr << "La saisie n\'est pas valide !" << std::endl;
}
int age {choix};
switch(n_race)
{
case 0:
m_animaux.push_back(std::make_unique<anx::Poisson::Poisson>(sexe, age, race, regime, nom, espece));
break;
default:
break;
}
}
void Aquarium::ajouterVegetal()
{
}
void Aquarium::voir()
{
for(auto & animal : m_animaux)
animal->voir();
}
void Aquarium::nouveauCycle()
{
}
|
animal.h
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 | #ifndef ANIMAL_H
#define ANIMAL_H
#include <string>
namespace anx
{
class Animal
{
private:
// Membres
char m_sexe;
int m_age;
std::string m_race;
std::string m_regime;
std::string m_nom;
protected:
// Getters
char Sexe() { return m_sexe; };
int Age() { return m_age; };
std::string Race() { return m_race; };
std::string Regime() { return m_regime; };
std::string Nom() { return m_nom; };
public:
// Ensemble Constructeur/Destructeur
Animal(char sexe = 'U', int age = 0, std::string race = "Inconnue", std::string regime = "Inconnu", std::string nom = "Inconnu")
: m_sexe(sexe), m_age(age), m_race(race), m_regime(regime), m_nom(nom) {} ;
virtual ~Animal() = default;
// Fonctions membres
virtual void voir() = 0;
virtual void seNourrir() = 0;
};
class Poisson : public Animal
{
private:
// Membres
std::string m_espece;
protected:
// Getters
std::string Espece() { return m_espece; };
public:
// Constructeur
Poisson(char sexe = 'U', int age = 0, std::string race = "Inconnue", std::string regime = "Inconnu", std::string nom = "Inconnu",
std::string espece = "Inconnue") : Animal(sexe, age, race, regime, nom), m_espece(espece) {} ;
// Fonctions membres
virtual void voir() override;
virtual void seNourrir() override;
};
}
#endif
|
animal.cpp
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 | // Headers C++
#include <iostream>
// Header de la classe
#include "animal.h"
// Corps de la classe
void anx::Poisson::voir()
{
std::cout << "Race : " << Race() << std::endl;
std::cout << "Espèce : " << Espece() << std::endl;
std::cout << "Régime alimentaire : " << Regime() << std::endl;
std::cout << "Sexe : " << Sexe() << std::endl;
std::cout << "Nom : " << Nom() << std::endl;
std::cout << "Âge : " << Age() << std::endl;
std::cout << std::endl;
}
void anx::Poisson::seNourrir()
{
}
|
En tout cas, merci à tous pour votre aide, je vais pouvoir continuer l’exercice du javaquarium tout en apprenant, car il n’y a qu’en pratiquant et en découvrant au fur et à mesure que je peux comprendre et retenir les choses, si je lisait le Primer de A à Z direct, j’aurai rien retenu, alors que là en posant des questions, en relisant le cours et en cherchant (beaucoup) de mon côté, j’arrive à mes fins.
Merci encore !
PS: Je reviendrai sûrement vous embêter encore si y’a encore des montagnes après celle-là