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 dans une classe dérivée!


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Points : 65
    Points
    65
    Par défaut problème d'accès dans une classe dérivée!
    Salut!

    j'ai utilisé un mécanismes d'héritage, mais lorsque je veux appeller une methode qui se trouve dans une classe-fille, le compilateur me dit que cette méthode n'est pas un membre de de la classe mere!

    je comprend pas pourquoi il me dit ca???
    y'a t-il quelque chose de pariculier a faire, sinon comment faire pour acceder a cette méthode?????

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Il faudrait que tu donnes un ECM (Exemple Complet Minimal), enfin un peu de code quoi, qu'on voit ce que tu as fait...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  3. #3
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par chrono23
    Salut!

    j'ai utilisé un mécanismes d'héritage, mais lorsque je veux appeller une methode qui se trouve dans une classe-fille, le compilateur me dit que cette méthode n'est pas un membre de de la classe mere!

    je comprend pas pourquoi il me dit ca???
    y'a t-il quelque chose de pariculier a faire, sinon comment faire pour acceder a cette méthode?????
    Si tu veux accèder à un membre de la classe fille, il faut le faire à travers un objet qui soit de ce type. Si tu as un pointeur vers la classe mère, même s'il pointe effectivement vers une instance de la classe fille, tu ne peux pas appeler les membres de la classe fille.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Points : 65
    Points
    65
    Par défaut
    ok vais faire le plus simple possible!

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    //A.h
    class A
    {
    public:
       int var1;
       int var2;
    public:  
       A();
       ~A();
       void fonction_a(param);
    };
     
    ////////////////////////////
    // A.cpp
    A::A()
    {
       ...;
    }
    A::~A()
    {
       ...;
    }
     
    void A::fonction_a(param)
    {
       ...;
    }
    ////////////////////////////
    //B.h
    #include "A.h"
     
    class B:public A
    {
    public:   
       int varB1;
       int varB2;
    public:
       B();
       ~B();
       void fonctionB(param);
    };
    ////////////////////////////
    //B.cpp
    B::B():A()
    {
       ...;
    }
    B::~B():~A()
    {
       ...;
    }
     
    void B::fonctionB(param)
    {
       ...;
    }
    //////////////////////
    //dans main
     
    #include "A.h"
     
    int main()
    {
       A* ptr;
       ptr = new B();
       // acces à la méthode focntionB()
       ptr->fonctionB();  // ici le compilateur aime pas!!!
     
    }
    Le compilateur me dit que fonctionB n'est pas membre de A????!!!!!!!!

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Points : 65
    Points
    65
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Si tu veux accèder à un membre de la classe fille, il faut le faire à travers un objet qui soit de ce type. Si tu as un pointeur vers la classe mère, même s'il pointe effectivement vers une instance de la classe fille, tu ne peux pas appeler les membres de la classe fille.
    Mon ptr est déclarer comme A, mais il instancie l'objet B, donc ca devrait marcher non????

  6. #6
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Comme l'a dit Jean-Marc, meme si le type reel de ton objet est B, son type declare est A, donc pour C++, fonctionB n'existe pas pour ton objet...

    il te faut faire un static_cast : [code]static_cast<B*>(ptr)->functionB();[code]
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Points : 65
    Points
    65
    Par défaut
    ouai mais a ce moment l'héritage ca sert pas a grand chose alors....

  8. #8
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Si,
    Soit,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class A
    {
    ...
    virtual void fonctionB(param)=0;
    ...
    }

    En « virtual pur » tu ne peux plus utiliser A directement

    Soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class A
    {
    ...
    virtual void fonctionB(param){};
    }
    Qui ne fait rien en A et peut être surchargé en B

    D’ailleur un

    ne serait pas de trop

  9. #9
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par chrono23
    ouai mais a ce moment l'héritage ca sert pas a grand chose alors....
    Et comment veux-tu qu'il sache qu'il doit appeler un membre fonctionB de la classe B et pas de la classe C qui hérite aussi de A et a aussi un membre fonctionB?
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  10. #10
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    +1 à ce qu'à dit Ti-R, tu confonds héritage (extension d'une classe) et polymorphisme (modification du comportement d'une classe selon son type réel)

    le premier peut mettre en jeu des fonctions n'existant pas dans la classe de base, alors que le second met simplement en jeu des fonctions virtuelles de la classe de base qui ont été redéfinies dans la classe dérivée
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Points : 65
    Points
    65
    Par défaut
    Oui alors effectivement c'est bien un problème de polymorphisme.
    J'ai essayé la méthode de la classe abstraite qui fonctionne bien sur(j y avais pas pense avant!)
    Mais le problème c'est que je dois donc mettre toutes les méthodes de mes classe filles en virtual dans la classe mere, pour que ca marche.
    Eh cela implique que que je dois coder toutes ces méthodes dans toutes les classes filles, ce qui fait que je vais me retrouver avec plein de méthodes NULL!!!

    Et ca c'est pas terrible, c'est meme plutot moche???

  12. #12
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Utilise la seconde solution
    Virtual non pur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class A
    {
    ...
    virtual void fonctionB(param){};
    }
    Cela évite d'hériter si ce n'est pas nécessaire.

  13. #13
    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
    Et ca c'est pas terrible, c'est meme plutot moche???
    Tout à fait... Si tu veux manipuler un B* là où tu as stocké un A*, tu as assurément un petit problème de conception.

    Tu peux nous détailler un peu le contexte, et ce que tu cherches à faire ?

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Points : 65
    Points
    65
    Par défaut
    C'est ce que j'ai fait mais le problème a ce moment c'est comme je l'ai dit plus haut: je dois faire toutes les méthodes d'accès de toutes les classes filles en virtual ce qui m'oblige a les coder dans chaque classe fille!
    ou alors ce n'est pas necessaire et c'est moi qui débloque???
    tu pense que je peux faire cela sans a avoir a coder les methodes dans chaque classe fille???

  15. #15
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Ti-R
    Utilise la seconde solution
    Ça permet de résoudre les symptômes... mais est-ce que le problème de fond est réglé? J'ai des doutes sérieux sur la validité d'une conception qui nécessite d'implémenter des fonctions virtuelles qui ne sont jamais appelées. Les cas où les fonctions virtuelles ne fond quelque chose que dans une classe dérivées sont un peu plus nombreux, mais il me semble que la conception doit être remise en question quand ça arrive.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Points : 65
    Points
    65
    Par défaut
    Oui alors le contexte, c'est que je déclare A* car je ne sais pas quelle forme va prendre mon A, mais il va prendre la forme de une des classe filles, qui penvent donc être B,C,D,...
    selon le type de chose que je dois modeliser, c'est donc du ploy morphisme typique.

    je peux etre encore plus precis si vous voulez mais ca va faire pas mal de texte a lire.

  17. #17
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par chrono23
    Oui alors le contexte, c'est que je déclare A* car je ne sais pas quelle forme va prendre mon A
    Mais tel que tu as rédigé ta question au départ, on a l'impression que quand tu appelles les fonctions, tu sais quelle forme a été choisie. Un static_cast (ou mieux un dynamic_cast pour vérifier l'hypothèse) peut être une meilleure solution qu'un paquet de fonctions membres virtuelles qui n'ont du sens que pour un seul descendant. Ou il est possible aussi que d'autres structures conviennent.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Points : 65
    Points
    65
    Par défaut
    je ne sais pas au moment de la déclaration quel forme mon *A va prendre, mais au moment de l'instanciation je saurai qu'il s'agit d'un B ou d'un C, ou D,...
    j'essayé le static_cast et le dynamic_cast aussi, mais le compilo n'aime pas!

    genre j'ecris ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    SequenceTS[0]->payload
                                ->static_cast<*PATSection>(Section)
                                                                ->SetSection_number(0xAA);
    Sequence contient des pointeurs de paquet. qui enx meme contiennet des pointeurs de payload, qui lui va contenir un pointeur de type Section, mais cette Section est une PATSection. et avec la methode SetSection_number je veux acceder un champ de la PATSection pointer par Section!

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Points : 65
    Points
    65
    Par défaut
    mince c'est pas jolie:

    c'est ca le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    SequenceTS[0]->payload->static_cast<*PATSection>(Section)->SetSection_number(0xAA);

  20. #20
    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
    Essaye comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static_cast<PATSection*>(SequenceTS[0]->payload->Section)->SetSection_number(0xAA);

Discussions similaires

  1. Problème d'accès dans une classe (.h vs .cpp)
    Par D3V1L J4M dans le forum Débuter
    Réponses: 2
    Dernier message: 05/09/2008, 14h54
  2. Problème de setInterval dans une Classe
    Par jeremie74 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 21/08/2007, 19h45
  3. Réponses: 8
    Dernier message: 17/04/2007, 11h35
  4. Problème Access Violation dans une classe
    Par randriano dans le forum C++Builder
    Réponses: 1
    Dernier message: 11/04/2007, 18h49
  5. Réponses: 4
    Dernier message: 17/03/2007, 01h06

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