bonjour,
je souhaite implémenté le design pattern stratégie en C++. Jusque là tout se passe bien.
Pour mon exemple, je prend le cas d'un guerrier (dérivé de la classe abstraite Personnages) qui utilise des armes (epee, hache, petite cuillère ...) dérivées de la classe abstraite Armes.
voici Personnage.hpp :
ensuite, un morceau de Personnage.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 class Personnages{ public: Personnages(const std::string&); virtual ~Personnages(); virtual void attaquer() {} void setArme(armes::Armes*); void setArme(armes::Armes&); void getArme(); std::string getNom() {return nom;} private: std::string nom; armes::Armes* arme; };
puis enfin le main()
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 Personnages::Personnages(const string& n) :nom(n), arme(0) { cout << "**** constructeur de personnage "<< nom << " ****\n"; } Personnages::~Personnages() { cout << "**** destructeur de Personnage " << nom << " ****\n"; if (arme) delete arme; } void Personnages::setArme(armes::Armes* new_arme) { if (arme) delete arme; arme = new_arme; } void Personnages::setArme(armes::Armes& new_arme) { setArme(&new_arme); }
Dans ce cas, le code fonctionne et me donne les bonnes informations, mais j'ai le droit
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 personnages::Guerrier g1("Minator"); g1.setArme(new armes::Hache(25)); g1.attaquer(); // ok ça marche sans problème // si je fais armes::Hache* hache = new armes::Hache(14); g1.setArme(hache); // pas de problème là non plus // mais dans ce cas .... armes::Epee epee(13); g1.setArme(epee); g1.attaquer();
à un joli <<erreur de segmentation>> dans mon destructeur de Personnages
J'ai essayé plusieurs idées pour palier au problème, sans succès.
J'avais pensé qu'il fallait 2 variables distinctes du style p_arme* et r_arme&, mais cela semble illogique et de toute façon, ensuite comment attaquer() sait se qu'il doit prendre en compte.
Cela doit pourtant bien être possible.
d'avance merci.
Partager