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 dans une classe


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 299
    Points : 140
    Points
    140
    Par défaut pointeur de fonction dans une classe
    Bonjour,

    je dois utiliser un pointeur de fonction mais je sais pas comment faire pour la déclarer en attribut d'une classe sachant quel fera référence à des méthodes de la mếme classe et elle sera appelé dans le code du fichier.cpp. Mon code sera mieux pour comprendre.

    fichier .h

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    #ifndef MYERSMILLERPROFILEALIGN_H
    #define MYERSMILLERPROFILEALIGN_H
     
    #include <vector>
    #include "ProfileAlignAlgorithm.h"
    #include "ProfileStandard.h"
    #include "ProfileWithSub.h"
    namespace clustalw
    {
     
    class MyersMillerProfileAlign : public ProfileAlignAlgorithm
    {
        public:
      virtual ~MyersMillerProfileAlign(){};
     
        /* Functions */
            MyersMillerProfileAlign();
            virtual int profileAlign(Alignment* alnPtr, DistMatrix* distMat, 
                                     vector<int>* group, int* aligned);
        /* Attributes */
           int (*scoreFunction)(int n, int m); //pointeur sur fonction
     
     
        private:
        /* Functions */
            void addGGaps(Alignment* alnPtr, SeqArray* seqArray);
            void addGGapsMask(vector<char>* mask,int len, vector<int>* path1, vector<int>* path2);
            int prfScore(int n, int m);
            int prfScoreMotif(int n, int m);
            int progTracepath();
            void progDel(int k);
            void progAdd(int k);
            void progAlign();
            int progDiff(int A, int B, int M, int N, int go1, int go2);
            int openPenalty1(int i, int j);
            int extPenalty1(int i, int j);
            int gapPenalty1(int i, int j, int k);
            int openPenalty2(int i, int j);
            int extPenalty2(int i, int j);
            int gapPenalty2(int i, int j, int k);    
        /* Attributes */
            ProfileWithSub* profileWithSub;
            ProfileStandard* profileStandard;
            int gapcoef1;
            int gapcoef2;
            int lencoef1;
            int lencoef2;
            vector<int> displ;
            vector<int> gS;
            vector<int> HH;
            vector<int> DD;
            vector<int> RR;
            vector<int> SS;
            vector<int> alnPath1;
            vector<int> alnPath2;
            int printPtr;
            int lastPrint;                        
            int matrix[32][32];
            vector<int> gaps;
            bool switchProfiles;
            const SeqArray* profile1;
            const SeqArray* profile2;
            int _gapPos1, _gapPos2;
            int alignmentLength;
            int **motif_score;
    };
     
    }
    #endif
    fichier .cpp

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    #ifdef HAVE_CONFIG_H
        #include "config.h"
    #endif
    #include "MyersMillerProfileAlign.h"
    #include "Iteration.h"
    #include <math.h>
     
    namespace clustalw
    {
     
    /**
     * 
     * @return 
     */
    MyersMillerProfileAlign::MyersMillerProfileAlign()
     : _gapPos1(userParameters->getGapPos1()),
       _gapPos2(userParameters->getGapPos2())
    {
     
    }
     
    /**
     * 
     * @param alnPtr 
     * @param distMat 
     * @param group 
     * @param aligned 
     * @return 
     */
    int MyersMillerProfileAlign::profileAlign(Alignment* alnPtr, DistMatrix* distMat, vector<int>* group, int* aligned)
    {
        //cout<<"ProfileAlign"<<endl;
        bool negative = false;
        int i = 0, j = 0, count = 0;
        int numSeq = 0;
        int seqNum = 0;
        int len = 0, len1 = 0, len2 = 0, is = 0, minLen = 0;
        int se1 = 0, se2 = 0, sb1 = 0, sb2 = 0;
        int maxRes = 0;
        int c = 0;
        int score = 0;
        double logmin = 0.0, logdiff = 0.0;
        double pcid = 0.0;
        int matrix[NUMRES][NUMRES];
        int numSeqsProf1 = 0, numSeqsProf2 = 0;
    //[......................]
     
        HH.resize(_maxAlnLength + 1);
        DD.resize(_maxAlnLength + 1);
        RR.resize(_maxAlnLength + 1);
        SS.resize(_maxAlnLength + 1);
        gS.resize(_maxAlnLength + 1);
        displ.resize(_maxAlnLength + 1);
     
     
        //appelle du pointeur sur fonction membre
        if(motif_score!=NULL) {
                if(isprf1==FALSE) scorefunction=seqseqscoremotif;
                else if(isprf2==FALSE) scorefunction=prfseqscoremotif;
                else scorefunction=prfprfscoremotif;
                /*else scorefunction=prfprfscore1motif;*/
        }
        else {
                if(isprf1==FALSE) scorefunction=seqseqscore;
                else if(isprf2==FALSE) scorefunction=prfseqscore;
                else scorefunction=prfprfscore;
                /*else scorefunction=prfprfscore1;*/
        }
     
        score = progDiff(sb1, sb2, se1 - sb1, se2 - sb2, (*profile1)[0][GAPCOL], (*profile1)[prfLength1][GAPCOL]);
     
        // May not need if we recreate the Profile every time!
        HH.clear();
        DD.clear();
        RR.clear();
        SS.clear();
        gS.clear();
     
    //[...]
    Donc j'ai une erreur à la compilation, qui me dit que j'appelle mal mon pointeur.

    Avez-vous une idée de comment faire?

    J'ai trouvé des choses sur le net mais c'est pour appelé le pointeur dans le main mais pas dans la même classe.

    Merci

    alaninho

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Ce ne sont pas des fonction mais des méthodes.

    Ensuite pour init un pointeur sur fonction dans une var on fait ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    ptrFct = &fct;
    Ensuite je te laisse lire ceci liens

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    une fonction membre a une signature particulière: TypeRetour Classname::method(args...) [const]Le plus efficace consiste à faire un typedef typedef Classname::(*ptrfct)(args...);Pour pouvoir déclarer dans ta classe un attribut ptrfct my_func;
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 299
    Points : 140
    Points
    140
    Par défaut
    Pour jouana,
    Oui, ça j'avais bien compris, comment l'appeler.

    Si j'ai bien compris, les méthodes sur lesquelles le pointeur va pointer doit être en static et public?

    Ensuite pour le pointeur sur méthode, je l'a crée où? dans le .h ou .cpp?

    Et le pointeur sera appelé dans le fichier .cpp dans une autre méthode, est ce que ça pose problème?

    par exemple :

    MyClass.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class MyClass {
     
    public:
       static int method(int n, int m);
       static int method2(int n, int m);
       void otherMet(int a);
       int (MyClass::*ptrMeth)(int n, int m); //est que c'est bon?
    }
    }
    MyClass.cpp

    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
     
    static int MyClass::method(int n, int m){
          int score;
          return score=n+m;
    }
     
    static int MyClass::method2(int n, int m){
          int score;
          return score=(n*m)+5;
    }
     
    void MyClass::otherMet(int a){
         if(a>0){
               ptrMet=&methode2;
         }
         else{
               ptrMet=&method;
          }
          int g=5;
          int score = ptrMet(g, a);
    }
    Est ce que c'est bon ça?

    Merci de ton aide

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 299
    Points : 140
    Points
    140
    Par défaut
    Est ce que tu peux me donner un exemple Bousk stp?

    Merci

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 299
    Points : 140
    Points
    140
    Par défaut
    J'ai une utilisé un typedef et ça facilite la chose. Donc merci de votre aide.

    Pour le moment, ça fonctionne.

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    il ne faut pas hésiter à écrire des typedefs (ou des using en C++11), ca aide l'implémenteur, l'utilisateur et la compréhension générale (par un nommage explicite).
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  8. #8
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Bonsoir,

    Le plus simple et générique est quand même d'utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::function<signature> var;

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

Discussions similaires

  1. Pointeur de fonction dans une classe
    Par devroot dans le forum C++
    Réponses: 7
    Dernier message: 06/07/2011, 13h36
  2. Vérifier existence fonction dans une classe
    Par zoparg dans le forum Langage
    Réponses: 2
    Dernier message: 17/02/2007, 13h29
  3. [POO] Fonctions dans une classe abstraite
    Par Seth77 dans le forum Langage
    Réponses: 4
    Dernier message: 27/06/2006, 13h21
  4. Appel de fonction dans une classe
    Par saint-pere dans le forum Langage
    Réponses: 3
    Dernier message: 08/05/2006, 22h13
  5. Appel de fonction dans une classe
    Par Seth77 dans le forum Langage
    Réponses: 8
    Dernier message: 16/01/2006, 10h32

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