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 :

Pointeur de fonction en paramètre d'une fonction membre


Sujet :

C++

  1. #1
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 547
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 547
    Par défaut Pointeur de fonction en paramètre d'une fonction membre
    Bonjour,

    j'ai un soucis avec un pointeur de fonction que je voudrais passer en paramètre dans une fonction membre d'une classe.

    Soit la classe
    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
    class CList
    {
    public:
       CList();
       ~CList();
     
       void Sort(bool bReverse);
     
       typedef bool(*FnCmp)(int, int); // la définition du pointeur de fonction
     
    protected:
       void QSort(int nStart, int nEnd, FnCmp compare);
       bool CompareUp(int a, int b);
       bool CompareDown(int a, int b);
    }
    et la fonction Sort agit comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void CList::Sort(bool bReverse)
    {
       if(bReverse)
          QSort(0, GetCount()-1, &CompareDown); // erreur C2664
       else	
          QSort(0, GetCount()-1, &CList::CompareUp); // erreur C2440
    }
    dans les deux cas j'ai une erreur similaire à la compilation :
    error C2664: 'CList::QSort' : impossible de convertir le paramètre 3 de 'bool (__thiscall CList::* )(int,int)' en 'CList::FnCmp'
    error C2440: 'cast de type' : impossible de convertir de 'bool (__thiscall CList::* )(int,int)' en 'CList::FnCmp'
    Est-ce que quelqu'un pourrait m'aider à résoudre ce problème si tant est qu'il est solvable ?
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  2. #2
    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
    Par défaut
    Ta fonction attend un pointeur sur fonction libre ou statique, et toi tu lui passes des adresses de fonctions membres. Les deux choses ont des types différents et ne sont pas compatibles.

    Question à trois sous : c'est pour un exo, ou bien c'est juste pour le plaisir de recoder la bibliothèque standard ?

    D'ailleurs tu devrais t'en inspirer (à défaut de l'utiliser) pour résoudre ton problème, en étudiant notamment le mécanisme des foncteurs.

  3. #3
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 547
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 547
    Par défaut
    Merci Loulou, c'est bien ce que je voyai mais je n'ai pas trouvé le moyen de lui faire accepter cela autrement qu'en externalisant mes fonctions

    A dire vrai je recode une ListBox en lui incluant entre autres une fonction de tri qui peut fonctionner dans les 2 sens mais aussi mes items ayant de nombreux paramètres je veux pouvoir trier selon le libellé, un ID, une couleur ect...

    sinon le mécanisme des foncteurs j'ai entrevu cela dans la FAQ je crois, je vais aller voir sinon faire quelques recherches histoire de savoir de quoi il s'agit
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  4. #4
    Membre chevronné
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Par défaut
    Salut !

    Pour que ça compile, il faut préciser dans la déclaration du type que c'est un pointeur sur une fonction membre de CList:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     typedef bool(CList::*FnCmp)(int, int);
    Comme Loulou24 l'a indiqué, ça n'a rien à voir avec une fonction "libre", ou avec une fonction statique de la classe CList. Mais d'ailleurs, dans ton cas est-ce que ces fonctions de comparaisons ne devraient pas être statiques (si elles ne font que comparer les entiers en parametre) ?

    Enfin, je rejoins encore Loulou pour dire que "les foncteurs, c'est bien"

    Donc tu pourrais recoder tout ça avec ta propre gestion de foncteurs, mais aussi utiliser (de manière transparente ou non) std::list. Pour que ca soit transparent, tu peux définir toi même les foncteurs, et proposer une méthode Sort avec en paramètre le champ à trier. Sinon tu peux laisser à l'utilisateur le soin de définir son propre foncteur quand il appelera ta méthode de tri (pas transparent du tout, mais moins galère pour toi).

    Par exemple pour le cas 1 (on peut faire mieux, et plus évolutif, mais c'est surtout pour illustrer):
    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
     
    class CList
    {
       enum EAttrib
       {
           Id,
           Libelle,
           Couleur
       };
     
    public:
     
       void Sort(bool _bReverse, EAttrib _attribute)
       {
           // appelle m_Liste.sort() avec le foncteur approprié
           // tu peux surement gérer ça bien mieux qu'avec une serie de "if"
       }
     
    protected:
     
       std::list<Truc>     m_Liste;
     
       // définition de tous tes foncteurs ...
    };

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 94
    Par défaut
    Citation Envoyé par shenron666
    sinon le mécanisme des foncteurs j'ai entrevu cela dans la FAQ je crois, je vais aller voir sinon faire quelques recherches histoire de savoir de quoi il s'agit
    Il y a aussi la littérature le livre de Stroustrup (la grosse encyclopédie du langage) explique tout ceci très très bien, moi j'ai tout compris avec

Discussions similaires

  1. pointeur de fonction en paramètre d'une fonction
    Par virtual_bug dans le forum C++
    Réponses: 4
    Dernier message: 06/01/2015, 22h36
  2. Réponses: 16
    Dernier message: 26/05/2009, 13h32
  3. Réponses: 8
    Dernier message: 05/07/2007, 13h44
  4. fonction en paramètre d'une fonction ?
    Par tuxout dans le forum Général Python
    Réponses: 1
    Dernier message: 02/06/2007, 15h54
  5. fonction comme paramètre d'une fonction
    Par velociraptor5679 dans le forum C++
    Réponses: 8
    Dernier message: 17/06/2006, 18h19

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