cast d'un pointer sur une fonction membre
Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

cast d'un pointer sur une fonction membre



  1. #1
    klark

    cast d'un pointer sur une fonction membre


    ------

    Bonjour,

    J'essaie de faire un cast d'un pointer sur une fonction membre vers un pointeur sur une fonction normale. Voici le programme que je l'ai écrit. Lorsque je compile j'obtiens l'erreur suivante : erreur: cannot convert ‘double (maClasse::*)()’ to ‘double (*)()’ in initialization

    Code:
    #include <iostream>
    
    
    using namespace std;
    
    class maClasse
    {
      double x;
    public :
      maClasse(double a)
      {
        this->x=a;
      }
      
      void setX(double a)
      {
        this->x=a;
      }
      
      double getX()
      {
        return x;
      }
      
      double carre()
      {
        return x*x;
      }
      
      
    };
    
    
     
    int main()
    {
      
      double (maClasse::*q) ()=&maClasse::carre;
      
      double (*fonc)() = q;// c'est la où ça bloque
      return 0;
    }
    Merci pour votre aide.

    -----
    Dernière modification par Jack ; 13/08/2011 à 11h12. Motif: ajout balises code

  2. #2
    Dlzlogic

    Re : cast d'un pointer sur une fonction membre

    Bonjour,
    int main()
    {

    double (maClasse::*q) ()=&maClasse::carre;

    double (*fonc)() = q;// c'est la où ça bloque
    return 0;
    }
    Je ne comprend pas ce que vous voulez faire.
    Voilà ce que j'écrirais
    Code:
    int main()
    {
      double a=25.68;
      MaClasse *mc = new MaClasse(a);
      double b=mc->getX();
    // on vérifie que b == 25.68
      mc->setX(4);
      double c=mc->carre();
    // on vérifie que c == 16
      delete mc;
      return 0;
    }
    Manifestement vous voulez travailler avec les références au lieu des pointeurs.
    Je veux bien vous expliquer ce qui ne va pas, mais il faudrait que vous me disiez pour les deux lignes du main ce que vous voulez faire.
    Du genre "je déclare une variable truc de type machin" etc
    "Je veux qu'elle soit égale à chose, comme c'est pas du même type, je fais un cast vers truc" etc...

  3. #3
    Jack
    Modérateur

    Re : cast d'un pointer sur une fonction membre

    Code:
      double (maClasse::*q) ()=&maClasse::carre;
    q n'est pas membre de la classe maClasse vu la déclaration.

    Manifestement vous voulez travailler avec les références au lieu des pointeurs.
    il n'est pas question de référence dans ce cas. & est utilisé comme opérateur d'adresse.
    A+

  4. #4
    Dlzlogic

    Re : cast d'un pointer sur une fonction membre

    Il est possible que notre ami cherche à créer un pointeur sur fonction. C'est une technique que j'ai peu employée, et, sauf erreur, une telle fonction ne peut pas retourner une valeur.
    C'est la raison pour laquelle il me semble utile que klark explique ce qu'il veut faire.
    D'autre part, le style "this->x ..." dans une fonction membre est autorisé (ok), quelquefois indispensable (pas d'exemple en tête), mais inutile dans le cas général. Autrement dit, je considère ce style comme une erreur (mais pas une faute).

  5. A voir en vidéo sur Futura
  6. #5
    polo974

    Re : cast d'un pointer sur une fonction membre

    Une fonction d'une classe est faite pour bosser sur les données de la classe, il faut donc pouvoir lui donner d'une manière ou d'une autre un lien vers ces données...

    Donc on ne peut utiliser que les pointeurs sur des fonctions statiques qui bossent sur des variables statiques...

    donc c'est normal que la conversion échoue.

    mais on peut déclarer une fonction:
    Code:
    int qq( maClasse &a )
    {
            return a.carre();
    }
    et dans la main soit utiliser la fonction, ou un pointeur sur cette fonction:
    Code:
            maClasse cl(2);
            cout << "qq  " << qq(cl) << endl;
    
            int (*qqq) (maClasse &) = &qq;
            cout << "qqq " << qqq(cl) << endl;

    et si on veut, on peut mettre la fonction en statique dans la classe:
    Code:
            static int qq( maClasse &a )
            {
                    return a.carre();
            }
    et dans la main soit utiliser la fonction, ou un pointeur sur cette fonction:
    Code:
            maClasse cl(2);
            cout << "maClasse::qq  " << maClasse::qq(cl) << endl;
    
            int (*qqq) (maClasse &) = &maClasse::qq;
            cout << "qqq " << qqq(cl) << endl;
    Jusqu'ici tout va bien...

  7. #6
    Chanur

    Re : cast d'un pointer sur une fonction membre

    Citation Envoyé par Dlzlogic Voir le message
    Il est possible que notre ami cherche à créer un pointeur sur fonction. C'est une technique que j'ai peu employée, et, sauf erreur, une telle fonction ne peut pas retourner une valeur.
    Si, elle peut retourner une valeur :
    int (*pointeur) (char*);
    int i;
    pointeur = atoi;
    i = pointeur ("27");

    Mais polo974 a raison, on ne peut créer à l'extérieur d'une classe que des pointeurs vers les fonctions statiques de la classe, sinon, elles ne peuvent pas connaitre les attributs.

  8. #7
    Dlzlogic

    Re : cast d'un pointer sur une fonction membre

    Bonjour,
    J'ai l'impression qu'on ne parle pas de la même chose.
    Un pointeur de fonction est forcément du type void, c'est à dire ne retourne pas de valeur.
    D'autre part, cette utilisation de pointeur de fonction est du C de base K&R et la référence à la notion de classe n'a pas lieu d'être.

  9. #8
    Chanur

    Re : cast d'un pointer sur une fonction membre

    Bonjour,
    Citation Envoyé par Dlzlogic Voir le message
    J'ai l'impression qu'on ne parle pas de la même chose.
    Un pointeur de fonction est forcément du type void, c'est à dire ne retourne pas de valeur.
    On ne doit effectivement pas parler de la même chose.
    Il ne me semble pas qu'un pointeur de fonction doive être void, on peut en utiliser pour n'importe quel prototype, non ?

    Citation Envoyé par Dlzlogic Voir le message
    D'autre part, cette utilisation de pointeur de fonction est du C de base K&R et la référence à la notion de classe n'a pas lieu d'être.
    Oui. Ou ANSI. J'aurais dû le préciser, mais ça ne change rien à la possibilité d'une valeur de retour.

  10. #9
    Dlzlogic

    Re : cast d'un pointer sur une fonction membre

    Bonjour,
    Ben, oui, effectivement, ce genre de fonction peut retourner une valeur. Je ne sais plus pourquoi j'avais ça dans la tête.
    Je viens de regarder mes sources, là où j'utilise cette technique.
    En fait, il y a très longtemps que je l'ai fait, et autant que je me souvienne, je n'avais pas été réellement convaincu.
    Par contre, elle ne sont pas en static, mais comme elles sont private dans une classe, ça revient à peu près au même.

    Donc je retire ce que j'ai dit, par contre lors des tentatives de transtypage, il y a des conditions de taille mémoire (type de pointeur, taille de fonction). Par ailleurs, je ne comprend pas très bien l'intérêt de transtyper le type de retour.
    Personnellement, je n'utilise ces techniques rares qu'après avoir soigneusement lu toute la doc et être sûr d'avoir tout compris.

Discussions similaires

  1. [c++][Qt] pointeur sur une fonction membre pointé par 3 pointeurs
    Par doul11 dans le forum Programmation et langages, Algorithmique
    Réponses: 0
    Dernier message: 13/01/2011, 10h24
  2. Cast sur C18
    Par thundertom dans le forum Électronique
    Réponses: 7
    Dernier message: 29/08/2010, 16h46
  3. [Biochimie] Reconnaitre une fonction cétone d'une aldéhyde sur une structure cyclique d'un ose
    Par invitec77376dd dans le forum Biologie
    Réponses: 3
    Dernier message: 09/02/2009, 21h29
  4. Pointer une planète ?????
    Par invite4a52f6c9 dans le forum Matériel astronomique et photos d'amateurs
    Réponses: 2
    Dernier message: 29/08/2006, 19h59