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 régulier
    Profil pro
    lkjlgj
    Inscrit en
    Février 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : Angola

    Informations professionnelles :
    Activité : lkjlgj

    Informations forums :
    Inscription : Février 2007
    Messages : 255
    Points : 96
    Points
    96
    Par défaut Pointeur de fonction dans une classe
    Bonjour,

    Je tente de partager une fonction membre d'une classe avec une autre classe
    sans recourir a l'option friend.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class A{
     
    public:
    QStringList findWord(QString);
     
    }
     
    class B{
     
    public:
    void setFunction(QStringList (*)(QString));
    }
    A l'intérieur de l'objet A, j'ai les lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CB = new ClassB();
    CB->setFunction(&findWord);
    Et là j'ai un message d'erreur:
    ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function.

    J'ai essayé avec this->&findWord, ça marche pas mieux...

    Si quelqu'un voit mon erreur ou peut suggèrer une autre approche, je suis preneur. Merci !

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut
    Hello,

    La signature d'un pointeur de fonction membre n'est pas la même que celle d'un pointeur de fonction libre ; dans ton cas :

    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
     
     
    class A{
     
    public:
    QStringList findWord(QString);
     
    }
     
    class B{
     
    public:
    void setFunction(QStringList (A::*)(QString));
    }
     
    // ...
     
    CB = new ClassB();
    CB->setFunction(&A::findWord);
    Par contre tu auras besoin à un moment ou un autre de fournir une instance de A a CB pour pouvoir invoquer la méthode findWord.

  3. #3
    Membre régulier
    Profil pro
    lkjlgj
    Inscrit en
    Février 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : Angola

    Informations professionnelles :
    Activité : lkjlgj

    Informations forums :
    Inscription : Février 2007
    Messages : 255
    Points : 96
    Points
    96
    Par défaut
    Ah oui, donc si B doit en savoir autant sur A, autant déclarer B comme friend de A non ?

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut
    Euh non, ta méthode findWord est public, pas besoin d'utiliser le mot friend, tout le monde y a accès.

  5. #5
    Membre régulier
    Profil pro
    lkjlgj
    Inscrit en
    Février 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : Angola

    Informations professionnelles :
    Activité : lkjlgj

    Informations forums :
    Inscription : Février 2007
    Messages : 255
    Points : 96
    Points
    96
    Par défaut
    Oui, mais je veux dire que si je dois fournir une instance de la classe A à la classe B,
    je vais devoir expliquer à B ce qu'est A par un include "classeA.h" dans B. C'est ce
    que je veux éviter...

  6. #6
    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

    A mon avis, conceptuellement, il doit y avoir un problème. Vouloir "partager" une fonction comme cela me semble étrange.

    2 cas :
    - soit findWord() n'accède pas à des données membre de A.
    Dans ce cas, tu peux faire une fonction libre ou tu peux faire une fonction membre statique ou tu peux créer une classe C contenant cette fonction.

    - soit findWord() accède à des données membre de A et dans ce cas, B doit connaître l'objet A sur lequel elle doit appeler la fonction. Donc B est obligé de connaitre A.

    Si tu expliques ce que tu souhaites faire, on pourra voir où se situe le problème.

    Remarque : pour rappel, je te conseille de relire la FAQ sur public et friend.

  7. #7
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    C’est pour faire une callback ? (seul cas d’utilisation où tu as raisonnablement besoin de ce genre de trucs à mon avis).

    Si oui, regarde du côté de boost::bind si tu peux l’utiliser, ça te simplifiera grandement la vie.

    Si non, revois ta conception. Ce n’est pas forcément gênant que B connaisse A.

  8. #8
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    boost::function est nickel pour les callback !
    Find me on github

Discussions similaires

  1. pointeur de fonction dans une classe
    Par alaninho dans le forum C++
    Réponses: 7
    Dernier message: 23/02/2013, 18h42
  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