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

  FORUM HardWare.fr
  Programmation
  C++

  Pointeur vers une méthode ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pointeur vers une méthode ?

n°541675
blackgodde​ss
vive le troll !
Posté le 16-10-2003 à 19:25:04  profilanswer
 

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 )-
mood
Publicité
Posté le 16-10-2003 à 19:25:04  profilanswer
 

n°541676
Taz
bisounours-codeur
Posté le 16-10-2003 à 19:28:22  profilanswer
 

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

n°541682
blackgodde​ss
vive le troll !
Posté le 16-10-2003 à 19:45:19  profilanswer
 

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 )-
n°541683
Taz
bisounours-codeur
Posté le 16-10-2003 à 19:48:22  profilanswer
 

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


 

n°541684
iS@mi
Resistance is futile !
Posté le 16-10-2003 à 19:48:38  profilanswer
 

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

n°541685
schnapsman​n
Zaford Beeblefect
Posté le 16-10-2003 à 19:50:19  profilanswer
 

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!"
n°541686
Taz
bisounours-codeur
Posté le 16-10-2003 à 19:52:33  profilanswer
 

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

n°541712
blackgodde​ss
vive le troll !
Posté le 16-10-2003 à 20:39:47  profilanswer
 

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 )-
n°541713
Taz
bisounours-codeur
Posté le 16-10-2003 à 20:41:43  profilanswer
 

des appels

n°541716
blackgodde​ss
vive le troll !
Posté le 16-10-2003 à 20:45:38  profilanswer
 

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 )-
mood
Publicité
Posté le 16-10-2003 à 20:45:38  profilanswer
 

n°541718
Taz
bisounours-codeur
Posté le 16-10-2003 à 20:48:42  profilanswer
 

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

n°541719
blackgodde​ss
vive le troll !
Posté le 16-10-2003 à 20:56:44  profilanswer
 

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


---------------
-( BlackGoddess )-
n°541721
Taz
bisounours-codeur
Posté le 16-10-2003 à 21:02:11  profilanswer
 

y a pas de problème

n°541845
Taz
bisounours-codeur
Posté le 16-10-2003 à 23:09:33  profilanswer
 

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
n°542089
blackgodde​ss
vive le troll !
Posté le 17-10-2003 à 10:50:20  profilanswer
 

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


---------------
-( BlackGoddess )-
n°542246
Taz
bisounours-codeur
Posté le 17-10-2003 à 13:01:37  profilanswer
 

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


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

  Pointeur vers une méthode ?

 

Sujets relatifs
[VC++] Lunknown vers CString...char *....[C] Liste chaînée / pointeur : problème !
importer des données d un fichier vers mysqlMethode pour modifier un enreg de MySQL ?
[HTML/js] Liens vers plusieurs frameColoration syntaxique de C++ vers du HTML, problèmes ....
Méthode de travail ?Passer un paramètre vers un formulaire composé de 2 cadres
renvoi vers une page en fonction du formulairepb de classe qui contient un pointeur vers une autre et inversement...
Plus de sujets relatifs à : Pointeur vers une méthode ?


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