IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Les callback et les classes


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut Les callback et les classes
    Salut,

    J'ai (peut etre tr�s mal) cherch� tant sur le net que sur le forum, mais je j'ai pas trouv� r�ellement la r�ponse que je cherche...Je me permet donc de vous la poser ici:

    Je cherche � comprendre le m�canisme d'impl�mentation du callback d'une m�thode de classe.

    Par exemple, une classe toute simple du genre de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    class MaClass
    {
        private:
    //some members
       public:
       void Mafonct(int a, int b);
    }
    Pour ce que j'en ai compris, il faut commencer par d�clarer une variable qui contienne un pointeur de fonction.

    En travaillant proprement, on utiliserait le typedef sous la forme de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    typedef void(*ptr2int) (int, int);
    ptr2int MonPtrFonction;
    (les noms �tant surtout choisis pour la compr�hension)
    Le deuxi�me travail est de cr�er une fonction qui appelle la fonction point�e
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    void CallBack2int(ptr2int ptr)
    {
        ptr();
    }
    (d�j�, l�, j'ai un doute sur les arguments � passer � CallBack2int )

    Voil�, en gros, ce que j'ai compris (si j'ai fait une erreur quelque part, merci de me le signaler )

    Les questions qui tuent: En allant du plus simple au plus compliqu�:

    Q1- Comment impl�menter les choses pour qu'un appel du genre de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    main
    {
    //...
         CallBack2int(MonPtrFonction);
    }
    appelle la m�thode Mafonct de ma classe ?
    Q2- Comment impl�menter CallBack2int et MonPtrFonction pour qu'ils soient respectivement m�thode et membre de MaClasse (qu'un appel � CallBack2int se fasse sous la forme de MonObjet->CallBack2int() ou MonObjet.CallBack2int () selon les circonstance)?

    Y a-t-il des points auxquels il faut etre attentif? (membres et/ou m�thodes statiques, par exemple)

    Q3- CallBack2int peut il etre m�thode virtuelle pure dans un but polymorphique?

    Je vous remercie d'avance
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  2. #2
    Membre chevronn�
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    D�tails du profil
    Informations personnelles :
    �ge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Par d�faut
    Une fonction membre a besoin d'une information en plus des param�tres : l'instance d'un objet sur laquelle elle va s'appliquer. Pour faire ce que tu veux, tu vas devoir utiliser quelque chose comme boost::bind.

    Pour ta troisi�me question, je n'a jamais test� avec boost::bind, mais intuitivement �a devrait marcher.

  3. #3
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Pour les pointeurs de fonction ete les classes, je dois avouer que je n'ai jamais utilis� de pointeur sur fonctions membres non-statiques.

    Mais je peux faire un exemple sur des fonctions membres statiques:
    Consid�rons une fonction callback qui prend en param�tre un pointeur et deux entiers. L'un des entiers sera un param�tre utilisateur, l'autre sera g�n�r� par la fonction qui appelle la callback.
    Code C/C++ : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef void (*ProcPtrDeuxInt)(void *pVoid, int nUser, int nIntern);
     
    void AppelerCallback(ProcPtrDeuxInt callBack, void *pVoid, int nUser)
    {
        int nIntern = QuelqueChose();
     
        callBack(pVoid, nUser, nIntern);
    }

    Maintenant, si on veut bosser avec des objets, on peut faire ainsi, sans modifier le type ni la fonction appelante:
    Code C++ : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    class CUneClasse
    {
    public:
        //On va la faire virtual en plus, si on veut
        virtual void VFaireQuelqueChose(int nUser, int nIntern);
     
        static void SLaFonctionPtrDeuxInt(void *pVoid, int nUser, int nIntern);
    };
     
     
    void CUneClasse::VFaireQuelqueChose(int nUser, int nIntern)
    {
        /* On fait un truc */
    }
     
    //[static]
    void CUneClasse::SLaFonctionPtrDeuxInt(void *pVoid, int nUser, int nIntern)
    {
        CUneClasse *pObj = static_cast< CUneClasse * >(pVoid);
        pObj->VFaireQuelqueChose(nUser, nIntern);
    }
    On voit ici que la fonction statique appelle la fonction de l'objet, qui peut �tre virtuelle.

    Et pour invoquer le tout, on fait un truc comme �a:
    Code C++ : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    int main(void)
    {
        int nUnNombre = 42;
        CUneClasse unObj;
     
        AppelerCallback(CUneClasse::SLaFonctionPtrDeuxInt, &unObj, nUnNombre);
        return 0;
    }

    Note: J'ai fait tout �a de t�te, sans test�. Mais c'est l'esprit, si �a ne marche pas je corrigerai.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    De fait, ton code fonctionne correctement.

    Je vais voir � l'adapter � un exemple plus compliqu�, et, si j'ai d'autres questions, je reviendrai sur le sujet
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  5. #5
    Membre averti
    Inscrit en
    Juin 2005
    Messages
    36
    D�tails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 36
    Par d�faut
    Citation Envoy� par koala01
    Q3- CallBack2int peut il etre m�thode virtuelle pure dans un but polymorphique?
    Que quelqu'un me contredise si j'ai faux, mais de mon exp�rience, �a ne fonctionne pas... Peut-�tre qu'il existe des impl�mentations dont je n'ai cure qui vont marcher avec le polymorphisme, mais la mienne en tout cas ne fonctionne pas... (en m�me temps, contourner le probl�me c�t� code client ne co�te presque rien)

  6. #6
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    D�cembre 2003
    Messages
    3 549
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 3 549
    Par d�faut
    Le mieux pour les callback c'est d'utiliser boost.function

  7. #7
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ing�nieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 46
    Localisation : France, Hauts de Seine (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur R&D
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    #include <cstdlib>
    #include <iostream>
     
    using namespace std;
     
    class A
    {
    	public:
    	A(){}
     
    	virtual void functA()
    	{
    			cout << "echoA\n";
    	}		
     
    	virtual void functAP()=0;
     
    };
     
    class B:public A
    {
    	public:
    	B(){}
     
    	void functA()
    	{
    			cout << "echoB\n";
    	}	
     
    	void functAP()
    	{
    			cout << "echoB Pure\n";
    	}	
    };
     
    int main(int argc, char *argv[])
    {
    	void (A::*pt_funct)();
     
    	pt_funct = &A::functA;
    	B b;
    	(b.*pt_funct)();
     
    	A *a = new B();
     
    	(a->*pt_funct)();
    	delete a;
     
    // Pur
    	pt_funct = &A::functAP;
     
    	B b_p;
    	(b_p.*pt_funct)();
     
    	A *a_p = new B();
     
    	(a_p->*pt_funct)();
    	delete a_p;
     
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    Je viens de tester rapidement, et pas de probl�me, compil� sous DevCpp

  8. #8
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Merci...

    Donc, on pourrait, selon les r�ponses obtenues, r�sumer ca sous la forme de

    -Un callback dans un objet doit etre static, donc, 1fonction appel�e-->1 callback

    -Callback et polymorphisme: oui si le callback en lui-meme est externe � tout objet

    (au passage: merci, vos codes m'ont permis de trouver les erreurs que je commettais )

    Citation Envoy� par loufoque
    Le mieux pour les callback c'est d'utiliser boost.function
    Je n'en doute pas, mais le but de ma question �tait surtout de me permettre de "fixer" dans mon esprit le m�canisme du callback...

    A titre "p�dagogique", il est donc mieux de "s'amuser" � en cr�er un de toutes pi�ces

    Je n'ai strictement rien contre les bibliotheques existantes, bien au contraire, mais je travaille g�n�ralement dans l'optique d' "apprendre � me d�brouiller par moi meme avant de trouver les bibliotheques qui le font pour moi"...
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  9. #9
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ing�nieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 46
    Localisation : France, Hauts de Seine (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur R&D
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par d�faut
    Citation Envoy� par koala01
    Merci...

    Donc, on pourrait, selon les r�ponses obtenues, r�sumer ca sous la forme de

    -Un callback dans un objet doit etre static, donc, 1fonction appel�e-->1 callback

    -Callback et polymorphisme: oui si le callback en lui-meme est externe � tout objet

    (au passage: merci, vos codes m'ont permis de trouver les erreurs que je commettais )
    J'ai peu �tre mal compris ce que tu viens de dire, mais tu as regard� mon code ?

    Tu peux faire l'appel d'une fonction statique � un objet, mais tu peux aussi faire l'appel d'une fonction non statique.

    Citation Envoy� par koala01
    oui si le callback en lui-meme est externe � tout objet
    Tu peux appeler une fonction de n'importe o�... statique ou non...

Discussions similaires

  1. afficher toutes les m�thodes et les variables d'une classe
    Par riyad25h dans le forum Collection et Stream
    R�ponses: 2
    Dernier message: 07/07/2010, 10h22
  2. les methodes et les associations entre les classes
    Par zin_rbt dans le forum Diagrammes de Classes
    R�ponses: 1
    Dernier message: 24/05/2010, 14h41
  3. R�ponses: 2
    Dernier message: 29/05/2007, 22h48
  4. [VB6]Enumérer les attributs et les méthodes d'une classe
    Par HPJ dans le forum VB 6 et ant�rieur
    R�ponses: 7
    Dernier message: 04/05/2004, 18h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo