Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1392 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1646785
casafa
Posté le 21-11-2007 à 20:38:46  profilanswer
 

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
mood
Publicité
Posté le 21-11-2007 à 20:38:46  profilanswer
 

n°1646796
Joel F
Real men use unique_ptr
Posté le 21-11-2007 à 21:15:15  profilanswer
 

mate du coté de boost::function

n°1647482
casafa
Posté le 22-11-2007 à 17:42:30  profilanswer
 

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
n°1647564
Joel F
Real men use unique_ptr
Posté le 22-11-2007 à 18:36:58  profilanswer
 

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
n°1647577
casafa
Posté le 22-11-2007 à 19:03:14  profilanswer
 

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
n°1647935
casafa
Posté le 23-11-2007 à 14:49:10  profilanswer
 

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 ?

n°1648162
casafa
Posté le 23-11-2007 à 19:02:36  profilanswer
 

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. }

n°1804298
jblecanard
Posté le 24-10-2008 à 17:18:18  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
Problème avec héritage et méthode virtuellePblm héritage et méthode "sans" argument...
outil pour passer des commandes linux sous windowspb "return" méthode java
Passer les arguments d'un Array dans un setTimeout.Probleme de methode
envoyer un fichier en methode POSTPasser une variable dans une fonction
Passer une liste a une fonction? 
Plus de sujets relatifs à : Passer un nom de méthode et ses paramètres en argument


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR