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 :

Affichage d'Instances Fantomes


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2009
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 109
    Par défaut Affichage d'Instances Fantomes
    Salut a tous ,

    Le titre est volontairement racoleur
    Voici donc le souci : J'ai une liste de Station, que j'arrive a afficher quand d'appel la méthode depuis une de ces instances ( station) .
    Cependant quand j'essai d'appeler cette méthode depuis des Station contenu dans une LIST , ca ne fonctionne plus. et je suis obligé de faire une liste de pointeur de stations, pourquoi donc ? .

    Voici le code :
    La classe Station : constructeur et afficheur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Station
    {
        public:
            int id ;
            int cycleCourant ; // TEMPS
            Conteneur* conteneurCourant ;
            Operateur* operateurCourant ;
    // ETC ......
    Ce code marche quand je l'appel depuis une station , donc ca vient pas de là.
    Et voici le parcours de la liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    list<Station> *sta = new list<Station>() ;
    sta->push_front(*station1) ;
    sta->push_front(*station2) ;
     
     list<Station>::iterator it = sta->begin() ;
        for (it ; it != sta->end() ; it++)
        {
            it->affichageTotal();
        }
    Voici ce qui en résulte :
    Station0: vide
    Station0: vide
    Au lieu d'afficher les id 1 et 2 , ca affiche 0. Il considere que ces instances sont vides , mais pourquoi , il est capable de copier une Station et la caser dans la liste normalement non ?

    Merci a ceux qui me donneront la réponse.

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Attention à ce que tu fais: tu déclare... un pointeur sur une liste de station et non une liste de pointeurs sur station, voila qui est différemment pas pareil

    La meilleure preuve (je présumes que station1 et station2 sont déclarées sous la forme de Station * station1 = new Station), c'est que tu demande de prendre... ce qui est pointé par station1 et station2

    Or, il n'y a, a priori, aucune raison de déclarer station1 et station2 comme étant des pointeurs (et donc de recourir à l'allocation dynamique de la mémoire pour ces deux variables), et il y en a encore moins de faire pareil avec la liste.

    De toute évidence, tu te "plante", simplement, dans ton code, qui devrait sans doute ressembler à :
    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
    int main()
    {
        /* création d'une liste de stations */
        std::list<Station> la_liste;
        /* création d'une première station ...*/
        Station s1;
        /* ... définition de ses membres, à ta charge ... */
        /* ... et insertion dans la liste */
        la_liste.push_back(s1);
        /* faire pareil pour les autres */
        /* parcours des éléments */
        list<Station>::iterator it = sta->begin() ;
        for (it ; it != sta->end() ; it++)
        {
            (*it).affichageTotal();
        }
        return 0;
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2009
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 109
    Par défaut
    Je comprends bien le principe de mon erreur : en fait je passe par des pointeurs pour ensuite utiliser ce qu'il pointe, ce qui est idiot.
    Mais de là a ce que ca empêche la list d'afficher correctement le contenu je comprends tjrs pas.

    J'ai essayé ce code - ci , l'affichage craint tjrs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        // Station
        Station station1 ;
        station1.id = 1 ;
        // Liste
        list<Station> sta  ;
        sta.push_front(station1) ;
        // parcours
        list<Station>::iterator it = sta.begin() ;
        for (it ; it != sta.end() ; it++)
        {
            (*it).affichageTotal();
        }
     cout << "Station 1 ID  : " << station1.id <<endl ;

    Affichage :
    Station0 : vide
    Station 1 ID : 1


    Comment ca se fait qu'il ne produise pas la meme chose pour une instance dans et hors de la liste ?

    ps : code d'affichage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void Station::affichageTotal()
    {
            cout << "Station" << this->id ;
            if (this->operateurCourant != NULL ){cout << ": Operateur" << this->operateurCourant->id ;}
            if (this->conteneurCourant != NULL ){cout << " , Conteneur" << this->conteneurCourant->id ;}
            if  ( (this->conteneurCourant == NULL ) && (this->operateurCourant == NULL ) )
            {cout << " : Vide" ;} cout << endl;
    }

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    LE problème est ailleurs. En reprenant les éléments que tu proposes, j'obtiens bien le bon comportement :
    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
    #include <iostream>
    #include <list>
     
    using std::cout;
    using std::endl;
    using std::list;
     
    class Station
    {
        public:
            int id ;
     
        void affichageTotal()
        {
                cout << "Station" << this->id ;
                cout << endl;
        }
    };
     
    int main()
    {
     
        Station station1 ;
        station1.id = 1 ;
        // Liste
        list<Station> sta  ;
        sta.push_front(station1) ;
        // parcours
        list<Station>::iterator it = sta.begin() ;
        for (it ; it != sta.end() ; it++)
        {
            (*it).affichageTotal();
        }
        cout << "Station 1 ID  : " << station1.id<<endl;
     
         return 0;
    }
    produit :
    Station1
    Station 1 ID : 1
    Aurais-tu défini un constructeur de copie ?

    P.S. : new systématique c'est java ou C# mais pas C++

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2009
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 109
    Par défaut
    En virant le constructeur par copie , ça marche.Vous avez une explication ?
    Merci beaucoup

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2006
    Messages : 37
    Par défaut
    Citation Envoyé par Knarf64 Voir le message
    En virant le constructeur par copie , ça marche.
    C'est la réponse à 3DA :-).

    Vous avez une explication ?
    Ton constructeur par copie était erroné.

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2009
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 109
    Par défaut
    Si je veux faire une boucle qui me creer 10 stations ce code ci ne fonctionnant pas , que dois je ajouter ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    list<Station> stations ;
    for (i = 0 ; i == nb_stations ; i ++ )
    {
        Station temp = Station(i) ;
        stations.push_front(temp) ;
    }
    merci encore

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/04/2018, 18h35
  2. Réponses: 22
    Dernier message: 26/09/2011, 16h14
  3. Réponses: 2
    Dernier message: 06/04/2011, 21h27
  4. Affichage instance JComponent sur JLayeredPane
    Par skual dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 27/03/2007, 11h50
  5. Réponses: 2
    Dernier message: 11/10/2006, 21h11

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