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 :

métodes et callbacks


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 64
    Points : 43
    Points
    43
    Par défaut métodes et callbacks
    Bonjour,

    Pour parser un fichier xml j'ai besoin de définir deux functions callbacks.
    Programmant en CPP j'aimerais que ces deux callbacks soient
    des méthodes "protected" pour que ce soit plus "propre".

    Cependant cela ne marche pas, et je suppose que cela est dû à une histoire de pointeurs de fonctions.

    Je m'explique plus en détails.

    Voici grosso modo mon code actuel :

    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
     
     
    /* les deux callbacks */
    void _StartElement(....) {
     
    }
     
    void _EndElement(....) {
     
    }
     
    /* mon constructeur */
     
    ma_classe::ma_classe() {
     
    .....
     
    XML_SetHandler(parser, _StartElement, _EndElement);
     
    ....
    }
    Et voici à quoi j'aimerais que mon code ressemble :
    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
     
     
    /* les deux callbacks */
    void ma_classe::_StartElement(....) {
     
    }
     
    void ma_classe::_EndElement(....) {
     
    }
     
    /* mon constructeur */
     
    ma_classe::ma_classe() {
     
    .....
     
    XML_SetHandler(parser, _StartElement, _EndElement);
     
    ....
    }
    Seulement cela ne marche pas, probablement un probléme de pointeurs ...

    Connaîteriez-vous une petite astuce pour que XML_SetHandler
    recupère bien les adresses mémoires de ma_classe::_StartElement et ma_classe::End_Element ?


    merci,
    -------------------

    @(zmodai)+

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    La réponse est dans la FAQ !

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 64
    Points : 43
    Points
    43
    Par défaut
    voici mon code modifié :


    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
     
    /* les deux callbacks */
    void ma_classe::_StartElement(....) {
     
    }
     
    void ma_classe::_EndElement(....) {
     
    }
     
    /* mon constructeur */
     
    ma_classe::ma_classe() {
     
    .....
     
    XML_SetHandler(parser, reinterpret_cast<void>(_StartElement), reinterpret_cast<void>(_EndElement));
     
    ....
    }
    j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ./screen.cpp: In constructor 'ma_class::ma_classe()':
    ./screen.cpp:51: error: invalid use of member (did you forget the '&' ?)
    ./screen.cpp:51: error: invalid use of member (did you forget the '&' ?)
    make: *** [all] Error 1
    si effectivement je place un & comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    XML_SetHandler(parser, reinterpret_cast<void>(&_StartElement), reinterpret_cast<void>(&_EndElement));
    j'otiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ./screen.cpp: In constructor 'ma_classe::ma_classe()':
    ./screen.cpp:51: error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function.  Say '&ma_classe::_StartElement'
    ./screen.cpp:51: error: invalid cast from type 'void (ma_classe::*)(void*, const char*, const char**)' to type 'void'
    ./screen.cpp:51: error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function.  Say '&ma_classe::_EndElement'
    ./screen.cpp:51: error: invalid cast from type 'void (ma_classe::*)(void*, const char*)' to type 'void'
    make: *** [all] Error 1
    Je modifie le code comme ceci:
    (ce qui parait plus logique :-))

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     XML_SetElementHandler(parser, reinterpret_cast<void>(&ma_classe::_ConfigStartElement), reinterpret_cast<void>(&ma_classe::_ConfigEndElement));
    et j'otiens ceci à la compilation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ./screen.cpp:51: error: invalid cast from type 'void (ma_classe::*)(void*, const char*, const char**)' to type 'void'
    ./screen.cpp:51: error: invalid cast from type 'void (ma_classe::*)(void*, const char*)' to type 'void'
    make: *** [all] Error 1
    je reviens au point de départ ...

    mon compliateur ne semble pas bien apprécier cette technique ...
    -------------------

    @(zmodai)+

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Sylvain Togni Voir le message
    La réponse est dans la FAQ !
    As-tu lu cette référence ?

  5. #5
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Il faudrait déjà nous montrer le prototype de la fonction XML_SetHandler, sans doute quelque chose comme ceci devrait convenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void XML_SetHandler(Parser const & parser, void MaClasse::*s(...), void MaClasse::*e(...));
    Sinon, désormais pour faire des callbacks perso je fais des foncteurs.

Discussions similaires

  1. Fonction callback
    Par saibe dans le forum Linux
    Réponses: 4
    Dernier message: 19/01/2012, 10h41
  2. [Débutant] fonction CALLBACK
    Par tlt dans le forum MFC
    Réponses: 2
    Dernier message: 29/10/2004, 16h55
  3. Callback
    Par el_diablos dans le forum Langage
    Réponses: 2
    Dernier message: 09/07/2004, 08h48
  4. Fonction callback dans une classe
    Par julian_ross dans le forum MFC
    Réponses: 8
    Dernier message: 02/03/2004, 11h42
  5. [MFC] Un callback dans des MFC ...
    Par elsargento dans le forum MFC
    Réponses: 3
    Dernier message: 18/02/2004, 16h04

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