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

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

Templates et pointeurs de fonctions membres?

n°895039
peak
Posté le 10-11-2004 à 12:01:56  profilanswer
 

Reprise du message précédent :
Ma première idée c'était de faire un  
 
static std::vector<ActionListenerFunctor*> actions[NBR_ACTION_TYPES];
 
En fait chaque composants de l'API a une table dans laquelle il garde ses pointeurs et il passe au controller l'adress de l'entré de sa table pour pouvoir  
 
gérer ses pointeur localement et changer de fonction puis effacer l'enter à la destruction du composant.
 
Mais j'ai un  
error C2036: 'class std::vector<void (__thiscall ActionListener<_Ty>::**)(int,int,int),class std::allocator<void (__thiscall  
 
ActionListener<_Ty>::**)(int,int,int)> > *' : unknown size
//d'ailleur malgré la doc je comprend pas trop cette erreur dans mon cas
et plus chiant ;  
error C2662: 'push_back' : cannot convert 'this' pointer from 'class std::vector<void (__thiscall ActionListener<_Ty>::**)(int,int,int),class  
std::allocator<void (__thiscall ActionListener<_Ty>::**)(int,int,int)> >' to 'class std::vector<_Ty,_A> &'
 
donc je m'était dis qu'un matrice ferait l'affaire ...
Mais évidement ça pouvais pas simplement marcher donc j'ai un problème d'allocation complètement débile; le compilateur ne détecte pas d'erreur mais dans le constructeur de Controller quand je fait :

Code :
  1. //...
  2. ActionListenerFunctor** Controller::actions;
  3. //j'ai simplifier l'histoire de la table locale le temps que ça marche  
  4. //sinon j'aurai ActionListenerFunctor*** Controller::actions;
  5. Controller() {
  6.  if(actions==NULL){
  7.   actions=new ActionListenerFunctor* [NBR_ACTION_TYPES];
  8.   for(unsigned i=0; i<NBR_ACTION_TYPES; i++){
  9.    actions[i]=new ActionListenerFunctor [INIT_CONTOLLER_LENGHT];
  10.    for(unsigned j=0; j<INIT_CONTOLLER_LENGHT; j++){
  11.     cout<<&actions[i][j]<<endl;
  12.     actions[i][j]=NULL;
  13.    }
  14.   }
  15.  }
  16. }


 
 si #define INIT_CONTOLLER_LENGHT 6 no prob
 si #define INIT_CONTOLLER_LENGHT 7 no prob
 si #define INIT_CONTOLLER_LENGHT 8 segmentation fault!?
 
0x049B1D30
0x049B1D38
0x049B1D40
0x049B1D48
0x049B1D50
0x049B1D58
0x049B1D60
0x00000038    plantage!
 
A croire que j'ai offensé le tout puissant par ce que là je vois pas le rapport !?
 
Sinon je met dans les pages de man qu'on peux pas avoir plus que 6compossants  :D et que faudra attendre la version 2.0 mais je commence à fortement douter que mon projet révolutionne le monde de l’informatique ce qui était pourtant ça vocation première...
 
LeGreg :
Passe à VC7 en plus c'est gratuit:
http://msdn.microsoft.com/visualc/vctoolkit2003/  
 
Ha tiens je savais pas que c'était gratuit je vais tester ça!, mais d'abord finir 2-3 autres details (style aujourd'hui je dois absolument commenter (j'ai 3000lignes du proj sans un comment) ... sans doute le truc le plus chiant de la semaine d'ailleurs...)

mood
Publicité
Posté le 10-11-2004 à 12:01:56  profilanswer
 

n°895946
Panini
Posté le 11-11-2004 à 13:40:08  profilanswer
 


 
:eek:
Merci mille fois pour cette info :jap:. Marre des incompatibilités de VC 6.

n°951550
peak
Posté le 12-01-2005 à 12:41:09  profilanswer
 

J'ai changé de compilateur (j'utilise maintenant g++ 3.3.3) et ceci pose encore un problème :

Code :
  1. #include <iostream>
  2. using namespace std;
  3. #include <functional>
  4. namespace
  5. {
  6.  struct ActionListenerBase : std::unary_function<void, int>
  7.  {
  8.   virtual void operator()(const int & ) =0;
  9.   virtual ~ActionListenerBase() { }
  10.  };
  11. }
  12. template<typename T>
  13. class ActionListener : ActionListenerBase
  14. {
  15.  T functor;
  16.  public:
  17.  ActionListener(const T &t) : functor(t) { }
  18.  void operator()(const int &x) { functor(x); }
  19. };
  20. #include <queue>
  21. #include <boost/shared_ptr.hpp>
  22. class Foo
  23. {
  24. typedef boost::shared_ptr<ActionListenerBase*> Listener;
  25.  std::queue<Listener> listeners;
  26.  public:
  27.  template<typename T>
  28.  void add_action_listener(const ActionListener<T> &al)
  29.  {
  30.   this->listeners.push_back(new ActionListener<T>(al));
  31.  }
  32. };
  33. class Test;
  34. typedef void (Test::*TestFunctor) (const int& );
  35. class Test{
  36. public:
  37.   void fonctionTest1(const int& k){
  38.  cout<<"appel de Test avec k = "<<k<<endl;
  39.   }
  40. };
  41. int main(){
  42.   TestFunctor tst_f = &Test::fonctionTest1;
  43.   ActionListener<TestFunctor> al(tst_f);
  44.   return 1;
  45.  
  46. }


test_functor.cpp: In member function `void ActionListener<T>::operator()(const  
   int& ) [with T = void (Test::*)(const int& )]':
/usr/include/c++/3.3.3/bits/stl_queue.h:108:   instantiated from here
test_functor.cpp:22: error: call to non-function `ActionListener<void  
   (Test::*)(const int& )>::functor'


 
Ceci compile-t-il chez vous ou est-ce normale?
 
 

n°953101
peak
Posté le 14-01-2005 à 14:04:16  profilanswer
 

bon, ok ; c'était claire que c'était normale  :ange:  
Mais bon c'est juste que j'avais du mal interpréter cette phrase de Taz:

Citation :

pour pouvoir foutre dedans tous ce qui permet d'écrire 'x(i)' retournant 'void'.


698jours plus tard ; alors que l'age de l'informatique et révolu, que c'est l'aube de celui de la lutherie, que le C++ tombe en désuétude.....j'ai ENFIN trouver une solution pour mon super contrôler de 20lignes!  :)
 
Pour ceux que ça intéresse et qui on lu jusque ici ce poste sans que la solution leur paraisse évidente, voici THE solution (ça rique de plaire aux puristes ça) :

Code :
  1. #include <iostream>
  2. #include <list>
  3. #include <functional>
  4. using namespace std;
  5. namespace
  6. {
  7.  struct ActionListenerBase : std::unary_function<void, int>
  8.  {
  9.   virtual void operator()(int ) =0;
  10.   virtual void invoke(int ) =0;
  11.   virtual ~ActionListenerBase() { }
  12.  };
  13. }
  14. template<typename ObjectType, typename FunctorType>
  15. class ActionListener : public ActionListenerBase
  16. {
  17.  ObjectType *p_obj;
  18.  FunctorType functor;
  19.  public:
  20.   ActionListener(ObjectType& _obj, FunctorType t ) : p_obj(&_obj), functor(t) { }
  21.   void operator()(int x) { return (p_obj->*functor) (x); }
  22.   void invoke(int x) {return (p_obj->*functor) (x);}
  23. };
  24. class Controller
  25. {
  26.  typedef ActionListenerBase* Listener;
  27.  std::list<Listener> listeners;
  28.  public:
  29.  template<typename ObjectType, typename FunctorType>
  30.  void addActionListener(const ActionListener<ObjectType, FunctorType> &al)
  31.  {
  32.   this->listeners.push_back(new ActionListener<ObjectType, FunctorType>(al));
  33.  }
  34.  void PerformAction(int k){
  35.   list<Listener>::iterator deb = listeners.begin() ;
  36.   while(deb != listeners.end()){
  37.    (*deb)->invoke(k);
  38.    deb++ ;
  39.   };
  40.  }
  41. };
  42. class Test1;
  43. typedef void (Test1::*Test1Functor) (int);
  44. class Test1{
  45. public:
  46.  void fonction1(int k){
  47.   cout<<"appel de fonction1 membre de Test1 avec k = "<<k<<endl;
  48.  }
  49.  void fonction2(int k){
  50.   cout<<"appel de fonction2 membre de Test1 avec k = "<<k<<endl;
  51.  }
  52. };
  53. class Test2;
  54. typedef void (Test2::*Test2Functor) (int);
  55. class Test2{
  56. public:
  57.  void fonction1(int k){
  58.   cout<<"appel de fonction1 membre de Test2 avec k = "<<k<<endl;
  59.  }
  60.  void fonction2(int k){
  61.   cout<<"appel de fonction2 membre de Test2 avec k = "<<k<<endl;
  62.  }
  63. };
  64. int main(){
  65.   Controller C;
  66.   Test1 obj_test1;
  67.   Test2 obj_test2;
  68.   ActionListener<Test1, Test1Functor> al_test11(obj_test1, &Test1::fonction1);
  69.   ActionListener<Test1, Test1Functor> al_test21(obj_test1, &Test1::fonction2);
  70.   ActionListener<Test2, Test2Functor> al_test12(obj_test2, &Test2::fonction1);
  71.   ActionListener<Test2, Test2Functor> al_test22(obj_test2, &Test2::fonction2);
  72.   C.addActionListener(al_test11);
  73.   C.addActionListener(al_test12);
  74.   C.addActionListener(al_test21);
  75.   C.addActionListener(al_test22);
  76.   C.PerformAction(3);
  77.   return 1;
  78. }

En fait je m'était jamais vraiment rendu compte de la puissance de l'utilisation du concept de fonction membre virtuelle pure et que c'était là la solution à mon problème de généralisation de template (malgré le fait que depuis déjà longtemps tout était devant moi).
 
Merci à tous et j'espère que vous m'en voudrez pas d'être parfois un rien  borné. :whistle:  
 
 :jap:

n°953500
el muchach​o
Comfortably Numb
Posté le 15-01-2005 à 08:57:50  profilanswer
 

Merci, joli travail. :jap:

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
question sur les fonctions virtuellesQuestion pointeurs
debug : evolution des pointeurs[Ada] Fonctions de manipulation de Strings
Lire les fonctions d'une dllLimite de taille dans les arguments de fonctions
excel - aide sur des fonctionspb de sessions/fonctions
Comment créer des fonctions PL/SQLfonctions et image
Plus de sujets relatifs à : Templates et pointeurs de fonctions membres?


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