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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    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 : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    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
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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
    Par défaut
    Arg, je m'en rappellerais jamais
    Désolé pour la mauvaise piste

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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.

+ 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