Passer un nom de méthode et ses paramètres en argument

Passer un nom de méthode et ses paramètres en argument - C++ - Programmation

Marsh Posté le 21-11-2007 à 20:38:46    

Bonjour,
 
Voici mon code source:

Code :
  1. #include <iostream>
  2. #include <vector>
  3. #include <boost/bind.hpp>
  4. #include <boost/function.hpp>
  5. using namespace std;
  6. class model
  7. {
  8.    public:
  9.       void show(){cout<<"show"<<endl;}
  10.       void move(int x, int y){cout<<"move"<<endl;}
  11. };
  12. class A
  13. {
  14.    public:
  15.       A()
  16.       {
  17.          vModel.push_back(new model());
  18.          vModel.push_back(new model());
  19.       }
  20.       void make(void (model::*fct)())
  21.       {
  22.          for(int i=0;i<vModel.size();i++)
  23.          {
  24.             boost::bind(fct, vModel[i])();
  25.          }
  26.       }
  27.    private:
  28.       vector<model *> vModel;
  29. };
  30. int main()
  31. {
  32.    A a;
  33.    a.make(&model::show);
  34.    //a.make(&model::move);
  35.    return 0;
  36. }


 
La ligne "a.make(&model::show);" permet d'appeler la méthode "show" de tous les modèles. C'est simple car la méthode ne prend aucun argument.
Mais comment feriez-vous pour passer les 2 arguments à la méthode "move" ? Et j'aimerais bien un système qui fonctionne avec n'importe quel méthode qui pourrait se trouver dans la class "model".
 
Merci d'avance...


Message édité par casafa le 21-11-2007 à 20:41:08
Reply

Marsh Posté le 21-11-2007 à 20:38:46   

Reply

Marsh Posté le 21-11-2007 à 21:15:15    

mate du coté de boost::function

Reply

Marsh Posté le 22-11-2007 à 17:42:30    

Merci pour ta réponse mais j'ai du mal, voici ce que j'arrive à faire :

Code :
  1. class A
  2. {
  3.    public:
  4.       A()
  5.       {
  6.          vModel.push_back(new model());
  7.          vModel.push_back(new model());
  8.       }
  9.       void make(boost::function<void ()> f)
  10.       {
  11.          for(int i=0;i<vModel.size();i++)
  12.          {
  13.             f();
  14.          }
  15.       }
  16.    private:
  17.       vector<model *> vModel;
  18. };
  19. int main()
  20. {
  21.    A a;
  22.    a.make(boost::bind(&model::move, new model(), 250, 300));
  23.    return 0;
  24. }


 
Le problème, c'est que lorsque j'appelle la méthode make, je doit lui fournir l'objet (new model()) mais moi je voudrais utiliser les objets qui se trouvent dans mon vecteur. Comment faire ? Merci

Message cité 1 fois
Message édité par casafa le 22-11-2007 à 17:45:39
Reply

Marsh Posté le 22-11-2007 à 18:36:58    

Code :
  1. class A
  2. {
  3.    public:
  4.       A()
  5.       {
  6.          vModel.push_back(new model());
  7.          vModel.push_back(new model());
  8.       }
  9.       void make(boost::function<void ()> f, int i, int j)
  10.       {
  11.          for(int i=0;i<vModel.size();i++)
  12.          {
  13.             boost::bind(&model::move, vModel[i], i, j)();
  14.          }
  15.       }
  16.    private:
  17.       vector<model *> vModel;
  18. };
  19. int main()
  20. {
  21.    A a;
  22.    a.make(250, 300);
  23.    return 0;
  24. }
 

ca parait bon non ?


Message édité par Joel F le 22-11-2007 à 18:37:27
Reply

Marsh Posté le 22-11-2007 à 19:03:14    

Non c'est pas bon...il faudrait que je puisse fournit le nom de la méthode que je désire exécuté à "make".
 
Une des solutions que je viens de trouvé est d'envoyer un pointeur NULL dans le boost::bind et de changer sa valeur avant l'exécution de la boost::function. Mais l'idée me parait assez barbare....Y a t-il moyen de faire mieux ?
 
Voici le code pour que vous compreniez mieux :

Code :
  1. class model
  2. {
  3.    public:
  4.       void show(){cout<<"show"<<endl;}
  5.       void move(int x, int y){cout<<"move"<<endl;}
  6. };
  7. model *m;
  8. class A
  9. {
  10.    public:
  11.       A()
  12.       {
  13.          vModel.push_back(new model());
  14.          vModel.push_back(new model());
  15.       }
  16.       void make(boost::function<void ()> f)
  17.       {
  18.          for(int i=0;i<vModel.size();i++)
  19.          {
  20.             m=vModel[i];
  21.             f();
  22.          }
  23.       }
  24.    private:
  25.       vector<model *> vModel;
  26. };
  27. int main()
  28. {
  29.    A a;
  30.    m=NULL;
  31.    a.make(boost::bind(&model::move, m, 250, 300));
  32.    m=NULL;
  33.    a.make(boost::bind(&model::show, m));
  34.    return 0;
  35. }


Message édité par casafa le 22-11-2007 à 19:04:24
Reply

Marsh Posté le 23-11-2007 à 14:49:10    

Oups, je viens de me rendre compte que mon code au-dessus, c'est du n'importe quoi...il fait une erreur de segmentation si les méthodes "move" ou "show" veulent accéder à un attribut de "model". Ce qui est logique vu que les méthodes reçoivent un "this" qui vaut NULL
Que faire ?

Reply

Marsh Posté le 23-11-2007 à 19:02:36    

Après plusieurs heures d'acharnement, j'y suis enfin arrivé...et s'était tout con.
Au cas où qq aurait le même problème, voici le code :

Code :
  1. class A
  2. {
  3.    public:
  4.       A()
  5.       {
  6.          vModel.push_back(new model());
  7.          vModel.push_back(new model());
  8.       }
  9.       void make(boost::function<void (model *)> f)
  10.       {
  11.          for(int i=0;i<vModel.size();i++)
  12.          {
  13.             f(vModel[i]);
  14.          }
  15.       }
  16.    private:
  17.       vector<model *> vModel;
  18. };
  19. int main()
  20. {
  21.    A a;
  22.    a.make(boost::bind(&model::move, _1, 250, 300));
  23.    a.make(boost::bind(&model::show, _1));
  24.    return 0;
  25. }

Reply

Marsh Posté le 24-10-2008 à 17:18:18    

Salut !
 
Bah moi ça m'a bien servi ! Merci beaucoup ! ça marche nickel  :love:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed