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 function et methode de classe


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut Pointeur de function et methode de classe
    Bonjour,

    J'ai défini un namespace comportant tout un ensemble de fonctions numériques dont certaines prennent des fonctions en arguments:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    namespace numeric
    {
      void f1();
      void f2();
      // ...
      double integration(double (*func)(double));
    }
    Ensuite dans une class C j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    using namespace numeric;
     
    class C
    {
      // ....
      double function(double d);
      void example();
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void C::example()
    {
      double d = integration(function); // ERROR
    }
    Le problème est que dans la fonction example, là où on attend du double (*)double on reçoit du double ( C:: )double, d'où erreur à la compilation.

    Ainsi, je peux régler cela en modifiant la fonction function en en faisant une fonction libre en dehors de la classe C.
    Cela compile mais je n'ai plus accès aux variables membres de la classe C (j'en ai besoin).

    J'ai essayé d'utiliser les template sans succès (error:<unresolved overloaded function type>).
    J'ai réfléchi à utiliser une fonction membre static mais cela impliques des variables static aussi.

    Vous l'aurez compris, je cherche un moyen de passer par arguments des méthodes membres à une fonction libre (définie dans un fichier et namespace à part).

    Merci de votre aide.

    EDIT 1
    J'ai trouvé une solution pour effectuer l'appel en changeant la signature de integration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class C;
     
    namespace numeric
    {
      void f1();
      void f2();
      // ...
      double integration(double (C::*func)(double));
    }
    Par contre dans le corps de integration, je n'arrive plus à appeler la fonction en argument:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    double integration(double (C::*func)(double))
    {
      double x = ....;
      double f = (*func)(x); // NE MARCHE PLUS
    }
    Il faut modifié l'appel mais je vois pas comment.

    EDIT 2

    Logiquement je pensais que cela devait être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      double f = (C.*func)(x);
    Mais ça ne marche pas non plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: expected primary-expression before ‘.*’ token

  2. #2
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut
    Mais C::function() prend deux arguments : un C* caché et un double.

  3. #3
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    En fait pour que cela marche je pense qu'il me faudrait une instance:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    double integration(double (C::*func)(double), C obj)
    {
        double f = (obj.*func)(x);
    }
    Mais je souhaiterai éviter cela et garder la signature:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double integration(double (C::*func)(double));

    EDIT
    J'ai vu la manière de faire suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        double f = (*this.*func)(x);
    Mais dans mon cas this n'as pas de sens car il s'agit d'une fonction libre (pas de classe), et donc j'ai le mesage d'erreur suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: invalid use of ‘this’ in non-member function

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    Par défaut
    Essaie d'utiliser un type template en guise de fonction.
    L'intérêt, c'est que tu pourras lui donner un foncteur.

    exemple de foncteur (un peu a l'ancienne):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Fonction {
    private:
        C const& ref
    public:
        Fonction(C const& ref) : ref(ref) {}
        double Fonction(double d) const {return ref.function(d);}
    };
    En fait, il s'agit grosso modo de ce que fait/faisait std::mem_fun
    Ca peut certainement se remplacer par une lambda, mais je ne sais plus l'écrire

  5. #5
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    En C++11, tu peux passer une lambda :
    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
    // g++ -Wall -Wextra -Wconversion -Wsign-conversion -std=c++11 -pedantic main.cpp -o main && ./main
     
    #include <iostream>
     
    class C
    {
    public:
     
    	void function(double const d) const { std::cout << "C::function(" << d << ")" << std::endl; }
    };
     
    template <class fct_t>
    void integration(fct_t && f)
    {
    	f(21.42);
    }
     
    int main()
    {
    	integration([](double const d) { C().function(d); });
     
    	return 0;
    }

  6. #6
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Merci de votre aide.

    Je dois rester en C++98, du coup je vais plutôt m'orienter du côté du foncteur, par contre j'ai pas bien compris dans mon cas ce que je dois faire.

    J'ai d'une part des fonctions libres .h/.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    namespace numeric
    {
      void f1();
      ...
    }
    Et de l'autre une classe C
    Je dois définir le foncteur où?

  7. #7
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    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.

Discussions similaires

  1. Réponses: 9
    Dernier message: 08/02/2006, 12h46
  2. [POO] Prob avec une méthode de classe
    Par Ludo75 dans le forum Langage
    Réponses: 9
    Dernier message: 06/02/2006, 22h37
  3. [DLL] Methodes de classe et dll
    Par chronos dans le forum C++
    Réponses: 11
    Dernier message: 27/04/2005, 17h18
  4. Méthode de classe et copie d'objets
    Par Duloup dans le forum Général Python
    Réponses: 5
    Dernier message: 11/04/2005, 16h27
  5. Visibilité de methodes dans Classe de Class
    Par Math75 dans le forum C++
    Réponses: 9
    Dernier message: 28/09/2004, 12h48

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