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 :

Problème d’accès avec les héritages multiples


Sujet :

C++

  1. #1
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut Problème d’accès avec les héritages multiples
    Salut !
    Je me croque le cerveau avec un petit problème d'héritage :'(
    Je créé une class A qui hérite de deux class B et C, je veux que les fonctions de B puisse avoir accès au fonction de C sans que celle si soit statique :^/
    pour mieux comprendre voila en gros ce que je veux 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    int main(void)
    {
       A objet;
       objet.FONCTION_DANS_B();
    }
     
     
    class A : public B, public C
    {
       ...
    };
     
    class B
    {
       public :
          void FONCTION_DANS_B()
          {
             Lecture_C();  //j'aimerais ici avoir accé a la fonction Lecture_C qui se trouve dans la class C, comment faire ?
          }
    };
     
    class C
    {
       public :
          void Lecture_C();
          {
             printf("Lecture dans C a partir de B");
          }
    };
    Comment je pourais faire ca ?

    Merci

  2. #2
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Il doit y a voir un problème de conception...
    B ne contient-il pas un C ?
    Ou alors, B ne peut-il pas être hérité de C ?

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    B et C n'ayant aucun lien, ça me paraît douteux ce que tu veux faire. Le lien entre B et C étant A, ce ne serait pas à partir de lui que tu voudrais faire communiquer B et C (ce qui serait cette fois faisable) ?

    Tu peux aussi donner les vrais noms des classes / fonctions, ça nous aidera à mieux cerner ce que tu cherches à faire.

  4. #4
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    Merci pour vos réponses =)

    Citation Envoyé par Laurent Gomila
    Tu peux aussi donner les vrais noms des classes / fonctions, ça nous aidera à mieux cerner ce que tu cherches à faire.
    ha ok, desoller :^/

    ma class A est en fait Camera
    la class B est PereObjet
    la class C est InterruptionTouche

    donc Camera est un objet, il hérite donc de PereObjet.
    pour géré les interruption du clavier, il hérite aussi de InterruptionTouche

    le problème est que une interruption du clavier peu avoir pour conséquence d’exécuter une fonction se trouvent dans PereObjet.


    Citation Envoyé par Eusebe
    Il doit y a voir un problème de conception...
    B ne contient-il pas un C ?
    Ou alors, B ne peut-il pas être hérité de C ?
    Pour que ça soit plus flexible mieux vaut pas :^/


    Citation Envoyé par Laurent Gomila
    Le lien entre B et C étant A, ce ne serait pas à partir de lui que tu voudrais faire communiquer B et C (ce qui serait cette fois faisable) ?
    oui effectivement, je croie que c’est la meilleur solution, que pence tu de donné à B (InterruptionTouche) un pointeur vers A(Camera) ?
    seulement là je me trouve devant un autre problème, la déclaration des class :^/

    A(Camera) a besoin de connaître B(InterruptionTouche) pour pouvoir utiliser ces fonctions, et B(InterruptionTouche) a besoin de connaître A(Camera) pour pouvoir définir son pointeur... qui definir en premier ? :^/

    Merci

  5. #5
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Et en créant une fonction virtuelle dans InterruptionTouche, qui serait implémentée dans Camera ?

    Cette fonction pourrait être appelée par InterruptionTouche, et appèle PereObjet si besoin...

  6. #6
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    Citation Envoyé par Eusebe
    Et en créant une fonction virtuelle dans InterruptionTouche, qui serait implémentée dans Camera ?

    Cette fonction pourrait être appelée par InterruptionTouche, et appèle PereObjet si besoin...
    bha en fait la fonction à appelée se trouve dans PereObjet donc je peu pas créé la même fonction dans InterruptionTouche en virtual car je croie pas que l'héritage surdéfinisse les fonctions virtual ...

  7. #7
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Sans refermer ta hiérarchie, il te faut passer par du cross-casting.

    Sinon ton truc me rappelle vaguement les mixins. Regarde si cela ne correspondrait pas à ce que tu cherches à faire. Il y a quatre articles dans mes souvenirs, je suis désolé tu vas devoir fouiller sur le site.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    le problème est que une interruption du clavier peu avoir pour conséquence d’exécuter une fonction se trouvent dans PereObjet.
    Du genre ?
    Qu'est-ce qui fait que ce n'est pas A qui fasse cet appel ? Si un objet dérive de InterruptionTouche sans être un PereObjet, que devrait-il se passer ?

  9. #9
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    Ok, J'ai réussi a déclarer les class corectement pour que B recoive un pointeur vers A...
    Il fallais que je place les déclarations des class dans des .h et les fonctions des class dans des .c puis include bien placé et un class A; dans le B.h


    Citation Envoyé par Laurent Gomila
    Du genre ?
    déplacer la camera par exemple...

    Citation Envoyé par Laurent Gomila
    Qu'est-ce qui fait que ce n'est pas A qui fasse cet appel ?
    A la base, c’était pour que se soit plus facile a intégré au autre class... si je veux faire la même chose sur la class Personnage, j'ai juste à faire qu'il hérite de InterruptionTouche et de PereObjet.
    Seulement c’est pas tout a fait possible a faire avec la technique que j’ai utiliser ( passer un pointeur de A(Camera) a la class B(InterruptionTouche) ) car ça veux dire que B(InterruptionTouche) ne peu pointer qu’un objet de type A(Camera) :^/ du coup je ne pouvais plus hérité ma class B(InterruptionTouche) a d’autre class que A(Camera)
    j’ai du donc un peu modifier mon concept et passer par un fonction intermédiaire qui se trouve dans A(Camera) :’(

    Citation Envoyé par Laurent Gomila
    Si un objet dérive de InterruptionTouche sans être un PereObjet, que devrait-il se passer ?
    Bah du coup maintenant ma fonction intermédiaire fait appelle au fonction de PereObjet seulement si c’est possible. Dans le cas ou un objet ne dérive pas de PereObjet, et qu’une interruption de touche demande l’exécution d’une fonction de PereObjet, rien ne se passera...

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Donc si j'ai bien compris ton raisonnement, lorsque tu appuies sur une certaine touche, toutes les instances dérivant de PereObjet et InterruptionTouche se déplacent ? Pas le choix ?

    Ce n'est pas ta caméra qui, lorsqu'elle reçoit une notification d'appui sur une touche, décide de se déplacer (ce qui semblerait plus logique) ?

  11. #11
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    Citation Envoyé par Laurent Gomila
    Donc si j'ai bien compris ton raisonnement, lorsque tu appuies sur une certaine touche, toutes les instances dérivant de PereObjet et InterruptionTouche se déplacent ? Pas le choix ?
    admettons que dans le main principale je fasse un ...->...->camera[3]->AjoutInteruptionTouche('k',...)->move(...)
    avec AjoutInteruptionTouche une fonction de InterruptionTouche et move une fonction de PereObjet.
    ça a pour effet que si au cour du programme on appuis sur 'k' alors la fonction move s'exécute avec les paramètre donné précédemment ^^

    Citation Envoyé par Laurent Gomila
    Ce n'est pas ta caméra qui, lorsqu'elle reçoit une notification d'appui sur une touche, décide de se déplacer (ce qui semblerait plus logique) ?
    non effectivement ce n'est pas directement la camera qui se déplace lorsque elle reçoit une notification mais c'est les class dont Camera hérite qui s’occupe de faire ça...
    comme ça pour les autre class (Personnage, ObjetFix...) j’ai juste a les faire hériter des class que je veux en fonction de si je veux qui réponde au interruption de touche, de souri, de click... et les action que je veux, Animer, Transformer…

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Dans ce cas une idée : tu pourrais prévoir un mécanisme plus général, notamment au niveau des fonctions associées aux touches. Ainsi InterruptionTouche n'aurait à connaître personne pour réaliser les appels de fonction.

    Un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    camera[3]->AjoutInteruptionTouche('k', bind(&PereObjet::move, camera[3], ...));
    Pour le bind, tu peux utiliser boost::bind couplé à boost::function par exemple.

  13. #13
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    Ha ouais EXELANT cette lib boost !!! je la connaissais pas ==)
    Merci

  14. #14
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par Ekinoks
    Ha ouais EXELANT cette lib boost !!! je la connaissais pas ==)
    Merci
    Ca fait plaisir de voir autant d'enthousiasme, d'habitude lorsqu'on sort boost les gens ont un vieux reflexe de rejet du genre "oh ça craint je veux pas apprendre / installer / compiler / utiliser / ... une bibliothèque externe blah blah... On peut pas faire pareil en C pur ?"

  15. #15
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    Erf c’est bien dommage que les gens réagisse comme ça, cette bibliothèque a l’air vraiment cool ==)
    J’ai fait quelque petite teste et c’est vraiment pratique !

    Par contre il y a un truc que je me demander, grâce a cette bibliothèque je peu donné un boost::function en paramétre pour pouvoir utiliser une fonction d’un objet sans pour autant connaître cette objet.
    Es possible aussi de donné les paramètre a donné lors de l’exécution du boost::function ?

    Car là pour l’instant, je fait un appelle du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AjoutInteruptionTouche('k',std::bind1st(std::mem_fun(&PereObjet::move), camera), x, y, z, ...);
    Avec un AjoutInteruptionTouche qui est du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void AjoutInteruptionTouche (char c,boost::function<int (int)> f,...) ;
    ça m’oblige à stocker les paramètre donné (x, y, z et autre) puis de les redonné lors de l’appelle...
    n’y a t’il pas un moyenne de maître tout ça dans le boost::function (ou autre boost) pour que l’appelle se fasse ensuite sans maître de paramètre ?
    un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AjoutInteruptionTouche(  'k'   ,   std::bind1st(  std::mem_fun( &PereObjet::move(x, y, z, ...) )  ,  camera  )   );

    Merci

  16. #16
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Les bindxxx de la STL ce n'est pas vraiment ce qu'il y a de plus pratique pour ça.

    Utilise boost::bind :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boost::bind(&PereObjet::move, camera, x, y, z);

  17. #17
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    Ca y j’ai utiliser la fonction bind a la place de bindxxx et c’est beaucoup mieux ==)

    L’appelle se fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...AjoutInteruptionTouche( 'k' ,boost::bind(&PereObjet::move, camera, x, y,z)) ;
    Je réceptionne en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void AjoutInteruptionTouche (char c,boost::function<void ()> f) ;
    ensuite pour l’appelle de la fonction j’ai juste a faire
    et ça m’appelle ma fonction avec tout les arguments mis précédemment

    En fait grâce a l’association de boost::bind et boost::function je peu stoker n’import quelle fonction quelle que soit d’ou elle provienne et quelle que soit son nombre d’argument c’est vraiment Gégnial !!!

    Gros Gros merci pour ton aide et pour m’avoir fait découvrire cette bibliothèque ==D

  18. #18
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    sans vouloir abuser, j'aurais encore une dernière petite question

    j’ai chercher dans la documentation de boost::bind et je n’ai rien trouver donc je ne sais pas si c’est possible :^/

    Au lieux de faire un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    boost::function<void ()> f = boost::bind(&PereObjet::move, camera, x, y,z);
    ...
    f();
    est t'il possible de donné le pointeur d'objet plus tard ? ou lors de l'exécution de la fonction ? un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    boost::function<void ()> f = boost::bind(&PereObjet::move, /*camera,*/ x, y,z);
    ...
    f.pObjet(camera); // bien que cette commende veux rien dire vue que f n'est pas un objet, n'y aurait il pas un truc équivalent ?
    ...
    f();
    mon but étant qu'a partir d'un seul bind pouvoir générer plusieurs fonctions de ce bind vers plusieurs objets différant.

    es possible ?

    Merci

  19. #19
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Yep.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    boost::function<void (Camera*)> f = boost::bind(&PereObjet::move, _1, x, y, z);
    ...
    f(camera)
    Tu peux ainsi utiliser _1, _2, _3, ... là où tu veux spécifier des paramètres qui seront passés à l'appel de la fonction.

  20. #20
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    Ha ok, c’est comme ça que ça marche

    Encore Merci pour ton aide =)

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

Discussions similaires

  1. Problème avec les jointures multiples
    Par kriskadespe dans le forum Langage SQL
    Réponses: 13
    Dernier message: 12/08/2011, 11h46
  2. Problème technique avec les états : lenteur
    Par stagolee dans le forum IHM
    Réponses: 5
    Dernier message: 21/09/2006, 11h19
  3. problème sql avec les concepteurs visual basic
    Par Le Rebel dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 08/05/2006, 10h25
  4. [VB6]Prob avec les requêtes multiples
    Par cammipascal dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 30/03/2004, 18h46

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