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 :

classe abstraite


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 2
    Points : 1
    Points
    1
    Par défaut classe abstraite
    Bonjour,

    j'ai un peu de mal avec les classe abstraite, et je remercie d'avance celui qui prendra un peu de temps pour me répondre.
    Voilà mon problème, j'ai une classe abstraite Element toute simple:

    Element.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     class Element {
             public :
             virtual void affiche() = 0;
     };
    et j'ai 2 classes qui dérive de cette classe abstraite, Collection et Literal:

    Collection.h
    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
    #include "Literal.h"
     #include "Element.h"
     #include "Maillon.h"
     
     class Collection:public Element {
           private:
              Maillon* tete;
              Maillon* queue;
     
           public:
              Collection();
              void ajout(Element* E);
              bool vide();
                void affiche();
                Maillon* getTete();
              Maillon* getQueue();
     };
    Literal.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include "Element.h"
     
     class Literal:public Element {
           private:
              char nom;
              bool polarite;
     
           public:
              Literal(char N, bool P);
              void affiche();
              char getNom();
              bool getPolarite();
     };
    Et puis Maillon.h si ça peux vous aidez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include "Literal.h"
     
     class Maillon {
           private:
              Element* info;
              Maillon* suiv;
     
           public:
              Maillon(Element* L);
              Maillon* getSuiv();
              void setSuiv(Maillon* M);
              void affiche();
              Element* getElement();
     };
    Et ensuite dans ma classe principale je veux faire ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Maillon* clauseCour = listeClause->getTete();
        Literal* litCour =  clauseCour->getElement()->getTete();
    listeClause est un objet de Collection.
    Ce code ne fonctionne pas, le message d'erreur est que getTete() n'est pas une méthode de la classe élement.
    Je ne sais pas comment faire, en fait j'ai une collection où chaque maillon est une autre collection (c'est pour ça que Collection dérive d'élément), et ces "sous-collections" sont des collections de litéral. Il faut que je parcours tout les litéraux.

    Je sais pas si c'est très clair, je peux vous mettre les .cpp si vous voulez aussi.

  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
    dans ce cas, il va te falloir caster le pointeur reçu par getElement pour qu'il soit considérer comme un pointeur de Collection...

    Mais il te faut être sûr que c'est bien le cas, sinon bonjour les erreurs d'éxécution...

    de tête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Maillon* clauseCour = listeClause->getTete();
        Literal* litCour =  dynamic_cast<Collection*>(clauseCour->getElement())->getTete();
    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
    Nouveau Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Swoög
    dans ce cas, il va te falloir caster le pointeur reçu par getElement pour qu'il soit considérer comme un pointeur de Collection...

    Mais il te faut être sûr que c'est bien le cas, sinon bonjour les erreurs d'éxécution...

    de tête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Maillon* clauseCour = listeClause->getTete();
        Literal* litCour =  dynamic_cast<Collection*>(clauseCour->getElement())->getTete();
    Oui oui je sûr que c'est bien le cas. Je vais essayer ce que tu dis, merci

  4. #4
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    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
    Maillon *tete = listeClause->getTete();
     
    while ( tete )
    {
       Collection *LitCol = tete->getElement();
       Maillon *Lit = LitCol->getTete();
     
       while ( lit )
       {
          Literal *LitCur = Lit->getElement();
          LitCur->affiche();
          Lit = Lit->getSuiv();
       }
     
       tete = tete->getSuiv();
    }
    Quelque chose comme ça ?
    L'itération est humaine; la récursion, divine.

  5. #5
    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
    le problème Mayti4

    c'est que Maillon::getElement() renvoie un Element et pas un Maillon ! donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       Collection *LitCol = tete->getElement();
    va planter à la compil, ou au moins émettre un warning
    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)

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Il y a une chose qui me dérange dans le modèle.
    Element est en fait une interface qu'on pourraît nommer Affichable puisqu'elle concerne uniquement ce point.
    C'est bien une caractéristique commune à Maillon et Literal mais son nom donne une fausse idée de son rôle.

    A mon avis, Maillon devrait plutôt exposer une méthode
    Puisque c'est un conteneur d'objets de type Literal.
    On ne peut pas faire boire un âne qui n'a pas soif.

  7. #7
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Tout à fait d'accord.

Discussions similaires

  1. [Debutant] Une classe abstraite en parametre ?
    Par kiroukou dans le forum Débuter
    Réponses: 8
    Dernier message: 03/02/2005, 15h05
  2. [Débutant(e)] toString + classes abstraites
    Par debdev dans le forum Langage
    Réponses: 9
    Dernier message: 26/01/2005, 15h22
  3. [Debutant][Conception] Classes abstraites et interface.
    Par SirDarken dans le forum Langage
    Réponses: 4
    Dernier message: 29/10/2004, 00h02
  4. Classe abstraite / MVC
    Par caramel dans le forum MVC
    Réponses: 5
    Dernier message: 01/04/2003, 09h27
  5. pb constructeurs classes dérivant classe abstraite
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 10/02/2003, 19h02

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