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 :

mélange de pointeurs sur fonctions et classes


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut mélange de pointeurs sur fonctions et classes
    Salut tous,

    je suis débutant en C++ (je n'ai jamais eu de cours dessus) et je l'utilise donc de façon basique mais j'essai petit à petit de m'améliorer.
    En ce moment j'essai d'utiliser des pointeurs sur fonctions et de les échanger entre mes classes.

    grâce à ce tuto trouvé sur un autre site, j'ai pu commencer à faire quelque chose :

    => mais par contre, comme je pars de très loin, j'ai encore pas mal de difficultés à comprendre et à l'appliquer, et encore pire dans mon cas réel où il y a plusieurs classes en jeu

    J'ai fais ci dessous un projet qui ressemble exactement à ce que je veux faire réellement
    => mais bien entendu la manière de faire est pas la bonne, ça ne marche pas du tout...

    => pourriez vous s'il vous plait me dire ce qui ne vas pas ?

    Voici ce que j'ai fais :
    main.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
    #include <iostream>
    #include <string>
    #include "dataClass.h"
    #include "calculation.h"
    using namespace std;
    int main() {
        //je remplis un vecteur avec les chiffres 1 et 2
        int nombreDeChiffres=2;
        DataClass dataClass;
        dataClass.remplissage(nombreDeChiffres);
        //dans mon autre classe je vais récupérer les nombres et les appeler dans un algo de resolution
        //et c'est là que je vais utiliser un pointeur sur fonction
        Calculation calculation;
        calculation.monCalcul(dataClass);
        return 0;
    }
    dataClass.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
    #ifndef DATACLASS_H
    #define DATACLASS_H
    #include <vector>
    class DataClass
    {
    public:
        DataClass();
        ~DataClass();
        void remplissage(int const &quantite);
        std::vector<double> getNombres();
    private:
        std::vector<double> mesNombres;
    };
    #endif // DATACLASS_H
    dataClass.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <iostream>
    #include <vector>
    #include "dataClass.h"
    using namespace std;
    DataClass::DataClass() {mesNombres.clear();}
    DataClass::~DataClass() {}
    void DataClass::remplissage(int const &quantite)
    {
        for (int i=0;i<quantite;i++){   mesNombres.push_back(i+1);    }
    }
     
    vector<double> DataClass::getNombres() {return mesNombres;}
    calculation.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
    #ifndef CALCULATION_H
    #define CALCULATION_H
    #include "dataClass.h"
    #include "fonction.h"
    class Calculation
    {
    public:
        Calculation();
        ~Calculation();
        void monCalcul(DataClass &objetData);
        double fonctionQuiestPointee(double x);
    private:
        Fonction fonction;
        double resultat;
    };
    #endif // CALCULATION_H
    calculation.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
    #include <iostream>
    #include <vector>
    #include "calculation.h"
    #include "dataClass.h"
    using namespace std;
    Calculation::Calculation() {}
    Calculation::~Calculation() {}
     
    typedef double (*pointeur)(double);
    void Calculation::monCalcul(DataClass &objetData)
    {   //mes 2 donnees que j'ai recupérés ailleurs
        vector<double> variablesEntree=objetData.getNombres();
        //definition de mon pointeur
        double (*pointeurSurFonction)(double);                /*déclaration du pointeur*/
        pointeurSurFonction = fonctionQuiestPointee;          /*Initialisation*/
        //appel de ma fonction de calcul qui utilisera ce pointeur
     resultat=fonction.additionBizarre(variablesEntree,fonctionQuiestPointee);
    }
    double Calculation::fonctionQuiestPointee(double x) {return x*2;}
    fonction.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #ifndef FONCTION_H
    #define FONCTION_H
    #include <vector>
    #include "calculation.h"
    class Fonction
    {
    public:
        Fonction();
        ~Fonction();
        double additionBizarre(std::vector<double>,pointeur ptr);
    private:
    };
    #endif // FONCTION_H
    fonction.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
    #include <iostream>
    #include "fonction.h"
    #include <vector>
    using namespace std;
    Fonction::Fonction() {}
    Fonction::~Fonction() {}
    double Fonction::additionBizarre(vector<double>coeff,pointeur ptr)
    {   
        double resultatFinal=0;
        //appel de mon pointeur
        double resultat1Fonction = (*ptr)(coeff[0]);
        double resultat2Fonction = (*ptr)(coeff[1]);
        //resultat final
        resultatFinal=coeff[0]*resultat1Fonction+coeff[1]*resultat2Fonction;
        //sortie
        return resultatFinal;
    }
    Comme vous pouvez le voir j'ai deux soucis :
    1°) comment définir proprement mon pointeur sur fonction
    2°) comment le renvoyer à des methodes d'autres classes ...

    pourriez vous me dire comment modifier cet exemple type pour qu'il fonction ?

    je vous remercie d'avance !

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Bonjour

    Pour le problème directement posé : FAQ C++ Pourquoi ne peut-on pas passer une fonction membre là où on attend un pointeur de fonction ?

    Pour répondre aux autres questions que tu ne poses pas :

    Est-ce qu'il est recommandé d'utiliser les pointeurs de fonction en C++ ?
    Non, faire une recherche sur le forum pour le pourquoi détaillé (pas de vérification de la signature des fonction à la compilation).
    Plus généralement, n'utilise pas de pointeur nu en ++ si tu débutes

    Existe-t-il des alternatives plus propres aux pointeurs de fonction ?
    Oui, plein.
    Cela va du design pattern Stratégie (lire Présentation des principaux design patterns en C++) à l'utilisation des foncteurs, des objets fonction, des lambdas ou de bind (C++11)

    A toi de voir si tu utilises le C++11 et ce que tu préfères comme syntaxe

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    merci beaucoup de ta réponse !

    j'ai regardé les foncteurs mais ça à l'air super hard !!!

    tu aurais pas un exemple simple pour m'illustrer ceci ?

  4. #4
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    FAQ + foncteur de donne : Qu'est-ce qu'un foncteur ?
    C'est juste une classe avec l'opérateur ()

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Évidemment, ça veut dire qu'on se retrouve à écrire des fonctions template juste pour pouvoir accepter le foncteur.

    Est-ce qu'il est recommandé d'utiliser les pointeurs de fonction en C++ ?
    Non, faire une recherche sur le forum pour le pourquoi détaillé (pas de vérification de la signature des fonction à la compilation).
    Ça, c'est archi-faux, sauf dans le cas signalé dans ma signature.

    Par contre, en C++, on préfère utiliser le polymorphisme par héritage et redéfinition de fonctions, sauf quand on ne veut pas écrire une nouvelle classe par fonction.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Pointeur sur fonction de classe anonyme
    Par dewsz dans le forum C++
    Réponses: 5
    Dernier message: 15/07/2008, 11h00
  2. [Win32] Pointeur sur fonctions et méthodes de classe
    Par Invité dans le forum Langage
    Réponses: 4
    Dernier message: 13/09/2007, 19h07
  3. Réponses: 12
    Dernier message: 30/06/2006, 16h46
  4. Glut / Class / Pointeur sur fonction
    Par areS. dans le forum GLUT
    Réponses: 5
    Dernier message: 02/12/2005, 20h50
  5. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37

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