Pointeur vers une méthode ?

Pointeur vers une méthode ? - C++ - Programmation

Marsh Posté le 16-10-2003 à 19:25:04    

Bonjour,
 
je voudrais pouvoir obtenir un pointeur vers le membre d'une classe.
 
j'ai essayé avec une classe contenant une méthode virtuelle pure, et une autre classe définissant cette méthode, mais je n'y suis pas arrivé :(
 
qq1 saurait-il comment faire ?
 
(je ne peux pas déclarer cette méthode statique et lui passer this en paramètre)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 16-10-2003 à 19:25:04   

Reply

Marsh Posté le 16-10-2003 à 19:28:22    

fonction membre s'il te plait
 
ben &Foo:fonction, tu veux pas filer un morceau de code µ?

Reply

Marsh Posté le 16-10-2003 à 19:45:19    

mmh ... voici un bout de code de ce que j'essayais de faire. Le but est d'avoir un pointeur sur un code appelant CallBack dans Foo. (ou directement un pointeur vers CallBack)
(pas taper si c pas beau)
 

Code :
  1. class Foo;
  2. class CallBackVirtual
  3. {
  4. public:
  5.   virtual void CallBack() = 0;
  6. };
  7. class CallBackHelp : CallBackVirtual
  8. {
  9.   Foo* Parent;
  10. public:
  11.   HookHelp(Foo* ptr) : Parent(ptr) {}
  12.   ~HookHelp() {}
  13.   void CallBack();
  14. };
  15. class Foo
  16. {
  17. public:
  18.   CallBackVirtual* cb;
  19.   Foo()
  20.   {
  21.     cb = new CallBackHelp(this);
  22.   }
  23.   ~Foo()
  24.   {
  25.     delete cb;
  26.   }
  27.   void Test()
  28.   {
  29.     // ici j'essaie d'avoir un pointeur vers cb->CallBack() qui, quand elle sera appelée, appelera this->CallBack
  30.     typedef (void* fCallBack)();
  31.     fCallBack fptr = cb->CallBack();
  32.   } 
  33.   void CallBack();
  34. };
  35. void CallBackHelp::CallBack()
  36. {
  37.   Parent->CallBack;
  38. }


 
mais le compilo me dit :  
cannot convert from 'overloaded-function' to 'fCallBack' (sur 'fCallBack fptr = cb->CallBack();')
 
je suppose que mon idée n'est pas bonne, il y a une solution ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 16-10-2003 à 19:48:22    

rien capté à ton code
 
voilà un début d'exemple
 

Code :
  1. #include <iostream>
  2. struct Foo
  3. {
  4.   void foo()
  5.   {
  6.     std::cout << "void Foo::foo()\n";
  7.   }
  8.   void foo(int)
  9.   {
  10.     std::cout << "void Foo::foo(int)\n";
  11.   }
  12.   void foo() const
  13.   {
  14.     std::cout << "void Foo::foo() const\n";
  15.   }
  16.   static void bar()
  17.   {
  18.     std::cout << "static void Foo::bar()\n";
  19.   };
  20. };
  21. int main()
  22. {
  23.   Foo obj;
  24.   Foo *ptr(&obj);
  25.   typedef void (Foo::*Foofoov)();
  26.   typedef void (Foo::*Foofooi)(int);
  27.   typedef void (Foo::*Foofoovc)() const;
  28.   Foofoov a(&Foo::foo);
  29.   Foofooi b(&Foo::foo);
  30.   Foofoovc c(&Foo::foo);
  31.   (obj.*a)();
  32.   (obj.*b)(42);
  33.   (obj.*c)();
  34.   (ptr->*a)();
  35.   (ptr->*b)(42);
  36.   (ptr->*c)();
  37. }


 

Reply

Marsh Posté le 16-10-2003 à 19:48:38    

Ben tu as déclaré ta fonction void CallBack(); et ici tu demandes à récupérer un fCallBack (fptr = cb->CallBack())  
 
C'est normal ?

Reply

Marsh Posté le 16-10-2003 à 19:50:19    

En c++, je préfère laisser tmober les focntions de call back si possible.
 
Au lieu de passer une fonction de call back, utilise un objet de call back sur lequel une méthode particulière sera appelée au déclenchement d'un évenement.


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 16-10-2003 à 19:52:33    

un objet-fonction quoi
 
faisez un tour chez stl et boost comme d'hab

Reply

Marsh Posté le 16-10-2003 à 20:39:47    

Code :
  1. (obj.*a)();
  2. (obj.*b)(42);
  3. (obj.*c)();
  4.    
  5. (ptr->*a)();
  6. (ptr->*b)(42);
  7. (ptr->*c)();


 
qu'est ce que c'est ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 16-10-2003 à 20:41:43    

des appels

Reply

Marsh Posté le 16-10-2003 à 20:45:38    

mais a quoi sert l' * ?
 
j'ai lu ton exemple, et en fait ce que je voudrais, c'est un pointeur vers une méthode d'un objet, pas un pointeur vers une méthode de la classe (je m'exprime p-e pas avec les bons termes :( )
 
je vais aller voir vers la stl et boost


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 16-10-2003 à 20:45:38   

Reply

Marsh Posté le 16-10-2003 à 20:48:42    

je crois que tu ne comprends pas grand chose. un objet n'a pas de fonction propre, il obeit à l'interface de sa classe. ce n'est pas possible de faire pointer une fonction comme tu le souhaites.
 
l'* ? ben à deferencer, comme pour les pointeurs ...

Reply

Marsh Posté le 16-10-2003 à 20:56:44    

oui, ca il me semblait avoir compris, ce que je cherche c'est donc a contourner le problème.


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 16-10-2003 à 21:02:11    

y a pas de problème

Reply

Marsh Posté le 16-10-2003 à 23:09:33    

Code :
  1. #include <boost/functional.hpp>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <string>
  5. struct Greeter
  6. {
  7.   Greeter(const std::string &n)
  8.     : name(n)
  9.   {}
  10.   void hello(const std::string &s) const
  11.   {
  12.     std::cout << this->name << " dit bonjour à " << s << '\n';
  13.   }
  14.   const std::string name;
  15. };
  16. int main()
  17. {
  18.  
  19.   const std::string tab[] = {"Porcinet", "Bouriquet", "Tigrou"};
  20.   Greeter g("Taz" );
  21.   std::for_each(tab, tab + sizeof tab / sizeof *tab, boost::bind1st(boost::mem_fun_ref(&Greeter::hello), g));
  22. }


 
ici il faut passer par boost, parce qu'on a une déficience de STL qui n'avait pas prévu tous les cas, une longue histoire


Message édité par Taz le 16-10-2003 à 23:10:58
Reply

Marsh Posté le 17-10-2003 à 10:50:20    

oui, j'ai commencé a étudier boost.fonction, j'essaie de comprendre comment ca marche. Merci :jap:


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 17-10-2003 à 13:01:37    

pas besoin de boost::function. il te faut juste un mem_fun_ref (ou mem_fun) et tu bind le premier argument à un objet. sinon tu peux le programmer à la main sans problème

Reply

Sujets relatifs:

Leave a Replay

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