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 sur une fonction membre


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 46
    Par défaut Pointeur sur une fonction membre
    Bonjour,

    Est il possible qu'un pointeur membre d'une instance de classe "A" pointe vers une fonction membre d'une instance de classe "B", sachant que la classe "B" est une classe dérivée de "A"?
    Si oui comment faire? Car je n'y arrive pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class A
    {
    void (*_fUpdate)(void);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class B: class A
    {
    void Update(void);
    }
    et j'aimerai pouvoir écrire
    sans que le compilateur m'insulte, du genre:
    error C2440: '='*: impossible de convertir de 'void (__thiscall B::* )(void)' en 'void (__cdecl *)(void)'

    Merci pour votre aide.

  2. #2
    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
    Non, parce que le pointeur sera appelé avec des valeurs de n'importe quel type compatible avec A (la base), pour lesquelles, la fonction n'existe pas.

    Par exemple, le pointeur peut contenir un A, ou encore un C (public A, mais pas B).


    Cela dit, cette réponse est pour une autre question...


    La réponse est plutot:
    B::update est une fonction liée à une instance (une méthode), ce n'est pas une fonction libre.

  3. #3
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut
    Salut,

    L'intérêt d'avoir une classe de base et des classes filles qui en héritent, c'est essentiellement d'avoir dans la classe mère les fonctionnalités qui sont communes à toutes les classes filles. D'un point de vue conceptuel, il n'y a donc un intérêt de faire ce que tu cherches à faire que s'il y a une erreur de conception. Du point de vue du langage, il n'est pas possible pour ta classe mère de connaitre ses classes filles.

    Maintenant, concernant ton besoin, je ne vois pas quel est l'intéret pour toi de procéder ainsi. Ce que tu peux donc faire :

    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
     
    struct A
    {
        virtual void update() =0; //pure virtual method => must be implemented in all subclasses of A..
    }
     
    struct B: public A
    {
       void update()
       {
          //specific update method for B classes..
       }
    }
     
    struc C: public A
    {
       void update()
       {
           //specific update method for C classes..
       }
    }
    Bon je n'ai pas fait de C++ depuis très longtemps, pas dit que le code soit correct, mais normalement l'explication l'est ^^

    Bon courage

  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
    Ton code est bon aussi (même si j'ai tendance à préférer expliciter les public:, et les commentaires en français).

    @pingouin84k: Il nous faut plus de conseil pour te donner une réponse adaptée au besoin.
    En général, les pointeurs de fonctions membres ne sont pas nécessaires.
    Il suffit de manipuler les objets via des références ou pointeurs

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 46
    Par défaut
    Merci à vous deux de m'avoir répondu! Voilà plus de détail de ce que j'essaie de faire.

    J'ai une classe qui représente un objet mathématique (un scalaire, un vecteur, une matrice, etc) dont les opérations arithmétiques sont déjà définies (j'ai overloadé les opérateurs et les fonctions mathématiques usuelles). Les valeurs des composantes de l'objet mathématique sont contenues dans un tableau de valeurs. Et a chaque fois qu'une fonction essaie d'accéder à ses valeurs, j'ai besoin de les mettre à jour par une fonction externe qui diffère d'une instance à l'autre.

    Ma classe fille dérive de la dernière car je rattache d'autres données à ses objets mathématique (par un exemple un nom de variable, ou les dérivées). Par ailleurs c'est à la classe dérivée que je souhaite faire appel pour mettre à jour les valeurs. J'utilise un héritage, car à ce stade, je n'ai pas vraiment envie de me retaper toute les surcharges d'opérateur et de fonctions mathématiques (car la solution pourrait être de déclarer la classe de base comme membre de la classe dérivée).

    J'ignore si c'est assez clair...

  6. #6
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut
    Citation Envoyé par pingouin84k Voir le message
    j'ai besoin de les mettre à jour par une fonction externe qui diffère d'une instance à l'autre.
    Si tu as une fonction qui diffère d'une instance à l'autre, soit tu essaies d'associer à une même famille des objets qui n'en font pas partie, soit au contraire tu ne spécialise pas suffisamment tes objets. Il s'agit donc d'une faiblesse dans ta conception.

    Sache également que, même si c'est déroutant au départ, une notion d'héritage dans le domaine des mathématiques ne s'applique pas forcément dans le domaine de la programmation. Par exemple, un carré est un rectangle mathématiquement, mais ceci n'est pas vrai en programmation, car ce la brise le principe de substitution de Liskov, principe SOLID devant être respecté pour garantir la bonne conception de ton programme.

  7. #7
    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
    Sans forcément entrer dans tous les détails, tu peux nous montrer deux classes de tes objets, et la fameuse fonction qui diffère?

    Par exemple math::vector et math::matrix (en supposant que math soit ton namespace... tu en as bien un, n'est-ce pas? )

    Au passage, puisque tu parles de matrices, tu as bien lu nos deux entrées dans la faq à leur sujet?

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

Discussions similaires

  1. Pointeur sur une fonction membre templatée et +
    Par metagoto dans le forum Langage
    Réponses: 2
    Dernier message: 09/08/2013, 02h05
  2. Réponses: 5
    Dernier message: 29/06/2006, 17h23
  3. Réponses: 3
    Dernier message: 16/05/2006, 18h22
  4. Pointeur sur des fonctions membres d'une classe
    Par Muetdhiver dans le forum C++
    Réponses: 3
    Dernier message: 15/02/2006, 11h35
  5. Probleme de pointeur sur une fonction
    Par nicky78 dans le forum C
    Réponses: 2
    Dernier message: 23/05/2004, 20h26

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