Se connecter / S'enregistrer
Votre question

[C++] Petit probléme de foncteurs !! Enfin je crois...

Tags :
  • string
  • Programmation
Dernière réponse : dans Programmation
30 Octobre 2007 16:32:18

Bonsoir !
J'ai un petit soucis de programmation que j'aimerais soumettre à la communauté, j'ai le cerveau en feu !

Voici les classes impliquées :

  1. class Groupe {
  2.  
  3. private:
  4. string nom;
  5. list<Creature *> groupe;
  6. public:
  7. Groupe(string nom):nom(nom){cout << "Creation du groupe" << nom << endl;};
  8. ~Groupe(){};
  9.  
  10. //Dégats
  11. void dalle();
  12. void trappe(int);
  13.  
  14. //Affichage
  15. void affGroupe();
  16.  
  17.  
  18. //Manipulation
  19. void changeTete(Creature *); //Changer le premier
  20. void ajoutAventurier(Creature * crea); //Ajout d'un aventurier au groupe
  21. void echange(Creature* a,Creature* b); //Echanger les places de deux membres
  22. void potion(int); //Donner une potion rendant x pv au plus faible
  23.  
  24. //Getter
  25. list<Creature *> & getList(){ return groupe; };
  26. Creature* getTete();
  27. int getMinPv(); //Renvoi le nb de pdv le plus petit du groupe
  28. };
  29.  
  30. class Creature {
  31.  
  32. private:
  33.  
  34.  
  35. protected:
  36. string nom;
  37. int pv;
  38. int poids;
  39. bool mort;
  40.  
  41.  
  42. public:
  43. Creature(string nom,int pv, int poids = 0):nom(nom),pv(pv), poids(poids), mort(false){cout << endl << "Je suis " << nom << ", j'ai " << pv << " points de vie.";};
  44.  
  45. virtual ~Creature();
  46.  
  47. virtual void encaisser(int degats)=0;
  48. void soigner(int valSoin);
  49. void setMort() { mort = true;};
  50. int getPv() { return pv; } ;
  51. int getPoids() { return poids; }
  52.  
  53. string getNom(){return nom;};
  54.  
  55.  
  56. };



Voici les methodes impliquées :

  1. void Groupe::potion(int pvRendu)
  2. {
  3. int min;
  4.  
  5. min=this->getMinPv();
  6. for_each(groupe.begin(),groupe.end(),bind1st(DonPotion(pvRendu),min));
  7. }
  8.  
  9. int Groupe::getMinPv()
  10. { MinPv min;
  11. min = for_each(groupe.begin(),groupe.end(),MinPv());
  12. return min.pvMin;
  13. }


et Voici le message d'erreur du compilateur :

  1. /usr/include/c++/4.1.3/bits/stl_function.h: In member function «typename _Operation::result_type std::binder1st<_Operation>::operator()(typename _Operation::second_argument_type&) const [with _Operation = DonPotion]":
  2. /usr/include/c++/4.1.3/bits/stl_algo.h:159: instantiated from «_Function std::for_each(_InputIterator, _InputIterator, _Function) [with _InputIterator = std::_List_iterator<Creature*>, _Function = std::binder1st<DonPotion>]"
  3. groupe.cpp:63: instantiated from here
  4. /usr/include/c++/4.1.3/bits/stl_function.h:412: erreur: passing «const DonPotion" as «this" argument of «void DonPotion::operator()(int, Creature*)" discards qualifiers


Je pense pas que la STL soit buggée xD.... donc j'ai du oublier quelque chose, merci à ceux qui proposeront des idées !

Autres pages sur : petit probleme foncteurs

30 Octobre 2007 17:13:07

salut,
foncteurs ?!? c'est un animal, une voiture, ... ?

DonPotion, c'est quoi?

si c'est pas trop long, tu peux mettre tes fichiers dans un endroit du web accessible?

sinon avec le peu d'info, je dirais que tu essais d'attribuer une valeur à une variable déclarée comme constante à l'aide d'un opérateur surchargé.
a b L Programmation
30 Octobre 2007 23:39:48

Le foncteur c'est en quelque sorte l'opérateur de cast.

  1. min = for_each(groupe.begin(),groupe.end(),MinPv());

pourquoi mets-tu les parenthèses après MinPv.
Ce que tu as écrit est équivalent à:
MinPv : : operator() ()
Il me semlbe que tu devrais mettre:
MinPv : : operator()

J'imagine que si tu mets directement MinPv, il ne veux pas car c'est une classe ? :) 

Ensuite, le for_each retourne "void", alors je vois pas trop ce que tu essaie de faire là :) 
30 Octobre 2007 23:43:29

CRicky a dit :
Le foncteur c'est en quelque sorte l'opérateur de cast.

je dormirai - con, je connaissais pas le terme :jap: 
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS