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 :

Liste chainée générique en c++


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 62
    Par défaut Liste chainée générique en c++
    Bonjour,

    voila, je veux faire une liste chainée générique ou plutot polymorphique !!
    dans ma classe Element j'ai un membre donné de type void* pour pouvoir stocké n'importe quel type que je veux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Element 
    {
      friend class Liste; 
      private:
        Element ( void * unNombre );
        Element ( const Noeud & unNoeud ); 
     
        void * MonNombre; 
        Noeud * suivant; 
    };
    mais quand je veux ajouté un element de type float dans ma liste grace à une méthode ajout :

    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
     
    void Liste :: Ajouter( void * leNombre )
    {
      Element * punNouveauNoeud = new Element( leNombre );
      if ( prmier  == 0 )
      {
        prmier =  punNouveauNoeud;
      }
      else
      {
        while( Suivant() ){} 
        courant->suivant = punNouveauNoeud;
     
      }
      courant = prmier; 
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uneListe->Ajouter((void*)3.15);
    j'ai cette erreur :
    cannot convert '3.149999...' from type 'double' to type 'void*'

    Et dans le cas d'un type de char, ça s'ajoute mais c'est au niveau d'affichage que je coince !! quoi faire SVP

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 126
    Par défaut
    Bonjour,

    Pour le premier point (l'appel), il serait plus juste de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    double val = 3.15;
    void* p = static_cast<void*>(&val);
    uneListe->Ajouter(p);
    Cordialement,
    A.

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Et attention à la durée de vie.
    Ton double doit survivre à la liste, car il n'est pas copié.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Et au lieu d'utiliser des void* utilisent des templates.

  5. #5
    Membre Expert
    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
    Par défaut
    Mis à part si c'est un exercice, je te conseille plutôt d'utiliser std::list<boost::any> .

  6. #6
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par Goten Voir le message
    Et au lieu d'utiliser des void* utilisent des templates.
    +1
    Les template, c'est fait pour ça. Les void*, bof bof.
    Boost::any ça va rajouter de la complexité pour rien. Les template s'en chargent largment.

  7. #7
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Bah les templates c'est pour faire une liste qui contient UN SEUL type d'éléments (voir ses sous-types éventuellement). une list de boost::any c'est pour faire une liste hétérogène.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 62
    Par défaut
    Ok, Merci ^^

    ça marche, mais j'ai toujour un probléme d'affichage ! maintenant même pour les double

    Avec des template je ne peut faire que des liste d'Entier, ou Double, Char,...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Liste <int> I;
    Liste <double> D;
    Or, moi je veux faire un truc :
    premier->int->char->float->int->NULL : polymorphique quoi !

    Et le boost::any ou le boost::variant, c''est pas quelque chose de standard

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 62
    Par défaut
    Citation Envoyé par agamitsudo Voir le message
    Bonjour,

    Pour le premier point (l'appel), il serait plus juste de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    double val = 3.15;
    void* p = static_cast<void*>(&val);
    uneListe->Ajouter(p);
    Cordialement,
    A.
    pourquoi c'est plus juste ?, alors que pour les int je fais que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uneListe->Ajouter((void*)314);

  10. #10
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Ca c'est un cast à la "C-style" en C++ on utilise les casts en _cast<> qui sont beaucoup plus propres et moins dangereux .

    http://cpp.developpez.com/faq/cpp/in...s#DIVERS_casts


    edit : encore une fois... trop lent :p

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par _medi Voir le message
    pourquoi c'est plus juste ?, alors que pour les int je fais que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uneListe->Ajouter((void*)314);
    Ne fais pas ça.
    Si tu tiens à faire un truc de ce genre, utilise des intptr_t, pas des void*. Et encore, même avec ça, tu ne pourras pas mettre un double dans ta liste sur un système 32 bits.

    De plus, je te conseille de rajouter à ta liste un indicateur de type (un entier avec des valeurs précises)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre Expert
    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
    Par défaut
    Merci les gars pour vos explication, mais c'est un school project ! alors je suis obligé de travaillé avec void*
    C'est un point important à préciser, effectivement .

    Dans ce cas, puisque c'est pour apprendre, je vais juste te donner quelques pistes sur comment faire bien. Voici les questions que tu dois te poser :

    • Qui gère la durée de vie des objets de la liste ?
    • Peut-on afficher un objet sans connaître son type ?


    Pour la première question, je vois trois solutions à peu près évidentes. Je te laisse les trouver.

    Pour la deuxième question, il me semble que tu l'as déjà posée. Alors, la réponse est non. Ce qui devrait t'amener à chercher un moyen de contourner cette limitation .

    Enfin, il est important pour cet exercice que tu comprennes bien ce qu'est un pointeur, ce qu'est une variable allouée sur la pile et une variable allouée dans le tas. Sinon, tu ne pourras pas faire quelque chose qui marche.

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

Discussions similaires

  1. Liste doublement chainée générique, erreurs !
    Par Virus721 dans le forum C++
    Réponses: 4
    Dernier message: 05/11/2010, 13h47
  2. Réponses: 4
    Dernier message: 30/10/2009, 11h45
  3. Réponses: 25
    Dernier message: 17/11/2008, 09h11
  4. Liste chainée double générique
    Par issou dans le forum C
    Réponses: 3
    Dernier message: 11/11/2005, 02h48
  5. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h25

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