Pointeur de fonction en paramètre

Pointeur de fonction en paramètre - C++ - Programmation

Marsh Posté le 10-09-2004 à 16:28:13    

Salut à tous,
 
c'est possible de passer un pointeur de fonction en paramètre d'un constructeur?
 
Ex:
 

Code :
  1. class A
  2. {
  3. private:
  4.    void toto(int i);
  5. public:
  6.    A();
  7. };
  8. class B
  9. {
  10. private:
  11.    void (*foo)(int i);
  12. public:
  13.    B(???) : foo(&???) {}
  14. };


 
Merci d'avance...

Reply

Marsh Posté le 10-09-2004 à 16:28:13   

Reply

Marsh Posté le 10-09-2004 à 16:34:07    

tu ne devrais plus trop avoir besoin de pointeurs de fonctions en c++ ... sinon, c'est tout à fait possible, mais apparemment, tu n'es pas trop familier avec la syntaxe
 
Edit :
ce serait plutôt quelque chose du style :

Code :
  1. class Foo {
  2. public:
  3.   Foo( void (*fct_ptr) () );
  4. }


 
à moins bien sur que j'aie mal saisi ce que tu voulais :jap:


Message édité par theshockwave le 10-09-2004 à 16:41:05
Reply

Marsh Posté le 10-09-2004 à 17:48:34    

s'il en a besoin, il en a besoin. pour ton histoire de A/B, tu va vite être un peu ennuyé, les pointeurs de fonctions membres  ne sont pas des pointeurs de fonctions classiques et ne sont pas liés à this. il faut faire un compromis PMF / template la plus part du temps. donne un exemple d'utilisation de ce que tu veux faire ?

Reply

Marsh Posté le 10-09-2004 à 21:40:56    

Taz a écrit :

s'il en a besoin, il en a besoin. pour ton histoire de A/B, tu va vite être un peu ennuyé, les pointeurs de fonctions membres  ne sont pas des pointeurs de fonctions classiques et ne sont pas liés à this. il faut faire un compromis PMF / template la plus part du temps. donne un exemple d'utilisation de ce que tu veux faire ?


 
PMF?? kesaco?
 
Je vais essayer d'expliquer ce que je veux faire:
 
j'ai une classe Video qui me permet de manipuler une vidéo (en gros comme le media player), et qui a une fonction Change_Video, appellant elle même 2 autres fonctions de VideoAffich, permettant de faire un reset de la vidéo affichée, et de charger la nouvelle vidéo.
 

Code :
  1. class TVideoAffich : public TForm
  2. {
  3. private:
  4. //...
  5. public:
  6. //...
  7.     void __fastcall Change_Video(const WideString & path_video);
  8. };


 
J'ai une classe Capture qui me permet de faire l'acquisition d'une vidéo depuis une caméra DV par exemple:
 

Code :
  1. class TVideoCapture : public TForm
  2. {
  3. private:
  4. //...
  5. public:
  6. //...
  7. };


 
J'ai une classe Indexation qui stocke dans une base de données des événements liés à cette vidéo, et qui utilise les classes précédentes.
 

Code :
  1. class TSaveData : public TForm
  2. {
  3. private:
  4. //...
  5.     TVideoAffich *Video;
  6.     TVideoCapture *Capture;
  7. public:
  8. //...
  9. };


 
J'ai une autre classe d'indexation des données, proposant un enregistrement plus sommaire des données, selon le choix de l'utilisateur, mais qui utilise aussi Video et Capture.
 
Je voudrais que la classe Capture puisse appeller la fonction Video::Change_Video sans être dépendante des classes d'indexation...
 
J'avais pensé à deux solutions: transmettre à Capture un pointeur vers l'objet Video, afin que Capture puisse appeller la fonction Change_Video, ou bien créer un pointeur de fonction vers Change_Video. Mais je ne sais pas si cette deuxième solution est viable. :??:

Reply

Marsh Posté le 10-09-2004 à 21:57:09    

Pointer to Member Function
 
si ton utilisation est simple, passe un pointeur/référence à l'instance

Reply

Marsh Posté le 10-09-2004 à 21:59:24    

Je pense effectivement que mon utilisation est simple...
L'appel à Change_Video depuis Capture permet juste à la vidéo d'afficher la nouvelle vidéo crée par Capture.
 
Mais j'ai pas bien compris... Je reste sur ma première solution, à savoir passer un pointeur de Video?

Reply

Marsh Posté le 10-09-2004 à 22:28:11    

oui, c'est simple et fonctionnel.

Reply

Marsh Posté le 10-09-2004 à 22:31:22    

OK, merci pour ta réponse... :)


Message édité par haazheel le 10-09-2004 à 22:32:04
Reply

Marsh Posté le 03-05-2005 à 15:57:42    

J'ai un peu le meme type de question, je voudrais utiliser le constructeur set qui a besoin de 2 arguments : le type stocké et un comparateur sur ce type.
 
set <int, less<int> >  
 
quand c'est les int, ca reste facile, mais je compte utiliser un typedef donc un type un peu plus complexe.
 
set <truc, MA_fonction >
 
Mais je ne sais pas comment passer ma fonction... pointeur, pas pointeur ?
 
Et plus globalement, je trouve que ce n'est pas très "objet" de faire comme ca, est ce la bonne maniere d'utiliser set ?
 
edit:
bon j'ai un peu honte de ma premiere application dans ce cadre, car elle est un peu simple...
mais je vous met le code pour eclaircir ma question
 

typedef struct {int mg,trpg;} Mg_Trpg;
 
inline bool less_Mg_Trpg(Mg_Trpg a, Mg_Trpg b)
{
 if (a.mg <= b.mg) return true;
 else return false;
}
 
set<Mg_Trpg, less_Mg_Trpg> table;


Message édité par NounouRs le 03-05-2005 à 16:00:30
Reply

Marsh Posté le 03-05-2005 à 16:18:58    

Et les foncteurs??

Reply

Marsh Posté le 03-05-2005 à 16:18:58   

Reply

Marsh Posté le 03-05-2005 à 16:21:23    

less est un foncteur qui fait intervenir l'operator<()
 
et qu'est-ce que tu fais avec ton typedef struct ? :o


Message édité par ++fab le 03-05-2005 à 16:26:59
Reply

Marsh Posté le 04-05-2005 à 09:43:38    

je comprend pas vos remarques...
Qu'est ce que j'ai mal fait ?

Reply

Marsh Posté le 04-05-2005 à 09:47:31    

if (a.mg <= b.mg) return true;
 else return false;  
 
magnifique

Reply

Marsh Posté le 04-05-2005 à 09:52:46    

oui, bon, allez      return  a.mg<=b.mg


Message édité par NounouRs le 04-05-2005 à 09:52:55
Reply

Marsh Posté le 04-05-2005 à 10:21:16    

Ton typedef sert à rien, struct tout court suffit.
Remplace less_Mg_Trpg par operator <, et tu pourras utiliser ta struct dans le set sans rien faire de particulier, car comme te l'a dit ++fab std::set utilise par défaut operator <, donc si tu le définit c'est bon.
Personnelement, je remplacerai ton <= en < dans ta fonction.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 04-05-2005 à 18:32:42    

merci

Reply

Sujets relatifs:

Leave a Replay

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