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 membre sur VC6


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Points : 106
    Points
    106
    Par défaut Pointeur de fonction membre sur VC6
    Bonjour !

    J'ai un souci avec une de mes classes.
    Ma class comporte une fonction Erreur et une fonction Execute. Dans la fonction Execute, j'instancie une classe dont une fonction membre prend un pointeur de fonction comme argument. La fonction argument que je veux lui passer est ma fonction Erreur, mais le compilateur me dit qu'il ne peut pas recuperer l'adresse de la fonction (je comprends un peu puisque faisant partie de ma classe, la classe n'est pas instanciee).
    Please Help !!

    Un bout de code schematique pour illustrer mon probleme :
    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
    typedef double (*funk)(double []);
     
    //classe appelante
    void ClAppelante::Execute()
    {
      funk pErrFunction = &ClAppelante::Erreur;
      ClAppelee *Appel = new ClAppelee(pErrFunction); //Genere l'erreur de compil
    }
     
    double ClAppelante::Erreur(double[])
    {
      ...
      return erreur;
    }
     
    //Classe Appelee
    void ClAppelee::ClAppelee(funk f)
    {
      ...
    }

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Essaye mem_fun ou mem_fun_ref.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 118
    Points : 158
    Points
    158
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    funk pErrFunction = &ClAppelante::Erreur;
    Cette ligne n'a aucun sens au niveau du typage.
    Tu affectes à pErrFunction une méthode alors qu'elle attend une fonction libre. Il n'y aucune chance que cela compile.

    Il faudrait corriger par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef double (ClAppelante::*funk)(double []);
    Et aussi, il n'y a pas de type de retour pour les constructeurs comme tu l'as fait ligne 17.

  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
    Salut,
    Et si possible, change de compilo. Visual 6 n'est plus maintenu mais surtout assez peu orthodoxe vis à vis de la norme C++.
    F.A.Q : Pourquoi ne peut-on pas passer une fonction membre là où on attend un pointeur de fonction ?
    Le plus simple est probablement la solution de backlash.

    Si tu mets à jour ton compilateur, ce serait mieux alors d'utiliser un std::function<double (double[])> plutôt qu'un pointeur de fonction.

  5. #5
    Membre régulier
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Points : 106
    Points
    106
    Par défaut
    Merci pour vos reponses, je vais regarder ca de plus pres...

    En fait, je ne peux pas changer de compilateur car je fais du support sur une machine qui avait ete codee a l'epoque sur VC6, alors je n'ai pas le choix, c'est des vieilles affaires que je deterre.

    Je vais essayer la solution de backlash et je vous redit ca !
    Merci encore

  6. #6
    Membre régulier
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Points : 106
    Points
    106
    Par défaut
    Citation Envoyé par backlash Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    funk pErrFunction = &ClAppelante::Erreur;
    Cette ligne n'a aucun sens au niveau du typage.
    Tu affectes à pErrFunction une méthode alors qu'elle attend une fonction libre. Il n'y aucune chance que cela compile.

    Il faudrait corriger par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef double (ClAppelante::*funk)(double []);
    En effet, j'ai essaye ta solution, mais ca n'a fait que deplacer le probleme puisque j'ai une erreur C2843 : cannot take the address of a non-static data member....

    J'ai betement essaye de declarer ma methode ErrFunction comme static, mais j'ai pas eu plus de reussite.


    Et aussi, il n'y a pas de type de retour pour les constructeurs comme tu l'as fait ligne 17.
    Oui desole, j'ai tape ces lignes de code vite fait pour illustrer mon probleme..

  7. #7
    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
    Ca va être dur si tu dois rester sur VC6

    As-tu bien essayé quelque chose comme ça :
    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
    25
    26
    27
    28
    29
    30
    31
    class ClAppelante;
    typedef double (ClAppelante::*funk)(double []);
     
    class ClAppelante
    {
    public:
    void Execute();
     
    double Erreur(double[]);
    };
    class ClAppelee
    {
    public:
       ClAppelee(funk f, ClAppelante *app)
       {
          double d[2];
          (app->*f)(d);
       }
    };
     
    //classe appelante
    void ClAppelante::Execute()
    {
      funk pErrFunction = &ClAppelante::Erreur;
      ClAppelee *Appel = new ClAppelee(pErrFunction,this); //Genere l'erreur de compil
    }
     
    double ClAppelante::Erreur(double[])
    {
      return 0;
    }

  8. #8
    Membre régulier
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Points : 106
    Points
    106
    Par défaut
    Un gros merci pour les precisions !
    Elles etaient en effet tres utiles

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 27/04/2008, 15h36
  2. Pointeur de fonction membre template
    Par bolhrak dans le forum Langage
    Réponses: 6
    Dernier message: 12/12/2006, 14h47
  3. Initialisation pointeur de fonction membre à 0
    Par bolhrak dans le forum C++
    Réponses: 9
    Dernier message: 09/12/2006, 19h41
  4. Pointeur de fonction membre.
    Par fabone dans le forum C++
    Réponses: 2
    Dernier message: 18/01/2006, 13h18
  5. Pointeur de fonction membre
    Par legend666 dans le forum C++
    Réponses: 1
    Dernier message: 04/10/2005, 20h46

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