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 :

Un pointeur de fonction qui pointe une méthode d'un objet


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Points : 90
    Points
    90
    Par défaut Un pointeur de fonction qui pointe une méthode d'un objet
    Bonjour à tous,

    J'ai crée un objet OBJECT qui contient une méthode move() dont voici le prtotype :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void move(int new_x, int new_y, unsigned int time, void(OBJECT::*callback)(int, int, unsigned int));
    .
    Le 4ème argument (callback) est un pointeur sur une méthode appartenant à OBJECT ou sur un de ses "descendant".

    Jusque là pas de problème. Mais voici l'implémentation de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        void OBJECT::move(int new_x, int new_y, unsigned int time, void(OBJECT::*callback)(int, int, unsigned int))
        {
            //Demande du déplacement au gestionnaire de collisons
            if(1)
            {
                m_x = new_x;
                m_y = new_y;
            }
            else
            {
                callback(new_x, new_y, time);
            }
     
        }
    Mais la le compilateur me renvoie l'erreur suivante :
    Citation Envoyé par GCC
    error: must use .* or -> to call pointer-to-member function in 'callback (...)'
    Je ne vois vraiment pas d'où cela peut provenir!
    Merci d'avance de votre aide!

    Sp@rtan03

  2. #2
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    vu ton exemple, je ne vois pas l'intéret d'un tel artifice : pour quoi ne pas faire simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void OBJECT::move(int new_x, int new_y, unsigned int time, OBJECT *obj)
        {
            //Demande du déplacement au gestionnaire de collisons 
               if(1)
      {
           m_x = new_x;
           m_y = new_y;
       }
               else
               {
            obj->callback(new_x, new_y, time);
        }
    }

  3. #3
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Citation Envoyé par Spartan03
    Mais la le compilateur me renvoie l'erreur suivante :
    "error: must use .* or -> to call pointer-to-member function in 'callback (...)'"
    C'est comme il dit: un pointeur vers une méthode membre ne s'appelle pas comme ça. Ce serait plutôt l'une de ses 2 utilisations:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    this->callback(new_x, new_y, time);
    (*this).*callback(new_x, new_y, time);
    Un pointeur sur méthode s'applique toujours à un objet qu'il faut spécifier (enfin, il me semble ).

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    La syntaxe correcte est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (this->*callback)(new_x, new_y, time);

  5. #5
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Arg, je m'en rappellerais jamais
    Désolé pour la mauvaise piste

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Points : 90
    Points
    90
    Par défaut
    Ok merci, ça compile enfin!
    Et ça marchera aussi si callback() appartient à un enfant de OBJECT?

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par Spartan03
    Ok merci, ça compile enfin!
    Et ça marchera aussi si callback() appartient à un enfant de OBJECT?
    Non, car la fonction que tu passes doit être membre de OBJECT.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par Laurent Gomila
    Non, car la fonction que tu passes doit être membre de OBJECT.
    D'accord, tant pis!

    Merci pour tout!

    Bonne soirée.

  9. #9
    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
    Points : 4 625
    Points
    4 625
    Par défaut
    Et ça marchera aussi si callback() appartient à un enfant de OBJECT?
    Ça peut parfaitement se faire, mais autrement. Avec des templates par exemple.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par loufoque
    Ça peut parfaitement se faire, mais autrement. Avec des templates par exemple.
    Mais bien sur!
    Je ne pense jamais aux templates!
    Je vais essayer de faire comme ça!
    Merci à toi loufoque.

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 581
    Points
    41 581
    Par défaut
    Tu peux passer une fonction d'une classe dérivée en la transtypant avec static_cast<>.

    Si ça ne marche pas avec static_cast<>, n'essaie surtout pas avec un autre opérateur de cast, car tu cours droit au plantage.

    Note: Tant que tu fais de l'héritage simple sans jouer avec les classes de bases virtuelles, ça marche toujours avec static_cast<>.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par Médinoc
    Tu peux passer une fonction d'une classe dérivée en la transtypant avec static_cast<>.

    Si ça ne marche pas avec static_cast<>, n'essaie surtout pas avec un autre opérateur de cast, car tu cours droit au plantage.

    Note: Tant que tu fais de l'héritage simple sans jouer avec les classes de bases virtuelles, ça marche toujours avec static_cast<>.
    Je viens d'essayer et effectivement ça marche nickel avec un static_cast!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 13
    Dernier message: 30/10/2014, 17h37
  2. Fonction qui déforme une image selon les 4 points du quadrangle
    Par Darkyl dans le forum Général JavaScript
    Réponses: 39
    Dernier message: 19/06/2012, 17h10
  3. Réponses: 2
    Dernier message: 16/03/2009, 14h37
  4. Réponses: 10
    Dernier message: 28/08/2008, 18h15
  5. Réponses: 7
    Dernier message: 03/12/2004, 12h40

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