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 :

Probleme conteneur list avec objet


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 10
    Par défaut Probleme conteneur list avec objet
    Je suis un débutant en programmation c++ (mais j'ai quand même des notions..).

    Je comprend le concepts de liste chaînée en c, mais j'aimerais le faire avec le conteneur list de stl en c++.

    J'ai quelque soucis...

    voici mon code:

    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
    //Librairies
    #include <iostream>         //entrée et sortie sur console
    #include <iomanip>          //manipulateur de donnée
    #include <stdlib.h>         // pour systeme
    #include <list>             // pour faire une liste
     
    using namespace std;
     
    //  class dridr
    class dridr
    {
        public:
        int age ;
     
        dridr ();
        ~dridr ();
     
    };
     
    //  fonction constructeur
    dridr::dridr()
    {
     
    }
     
    //  fonction destructeur
    dridr::~dridr()
    {
     
    }
     
    //  Programme principale
    int main()
    {
        list<dridr> lp (2);                 //liste de 2 élément de type dridr
        list<dridr>::iterator il;           //itérateur de ma liste
     
        //crée 2 élément de liste de type dridr
        for (il = lp.begin(); il != lp.end();il++)
        {   
            //le problème est ici!!!
            il = lp.insert(il,age);
     
        }
     
     
        system ("pause");
        return 0;
    }

  2. #2
    Invité
    Invité(e)
    Par défaut
    Vu ce que tu veux faire tu devrais t'orienter vers la classe std::vector. Au lieu de faire insert, tu fais tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    *iterator = dridr(age);
    A noter que les std::vector peuvent initiliser tous leur éléménet avec une même valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::vector monVec( 2, dridr(age) );
    PS : Pense à utiliser les balise de code (le dièse), ça facilite la (re)lecture du code

  3. #3
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 10
    Par défaut prob vector
    voila ce que j'ai fait mais c'est toujours pas probant...:

    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
    //Librairies
    #include <iostream>         //entrée et sortie sur console
    #include <iomanip>          //manipulateur de donnée
    #include <stdlib.h>          // pour systeme
    #include <vector>           // pour faire un vector
     
    using namespace std;
     
    //  class dridr
    class dridr
    {
        public:
        int age;
     
        dridr ();
        ~dridr ();
     
    };
     
    //  fonction constructeur
    dridr::dridr()
     
    {
     
    }
     
    //  fonction destructeur
    dridr::~dridr()
     
    {
     
    }
     
    //  Programme principale
    int main()
    {
     
        //variable local
        int age = 0;
     
        //entree user
        cout << "veuillez rentrer un age: ";
        cin  >> age;
     
        //vector de 2 élément de type dridr   problème ici!
        vector<dridr> monvec(2,dridr(age));
     
        //itérateur de ma liste
        vector<dridr>::iterator il;
     
        //crée 2 élément de liste de type dridr
        for (il = monvec.begin(); il != monvec.end();il++)
        {
            //le problème est aussi ici!!!
            *iterator = dridr(age);
     
        }
     
     
        system ("pause");
        return 0;
    }

  4. #4
    Invité
    Invité(e)
    Par défaut
    Le **problème** vient de la classe dridr, pour pouvoir être construit avec un age spécifique, il faut absolument le constructeur correspondant, c'est à dire un constructeur prenant un entier comme paramètre et l'affectant à la variable dridr::age, de préférence en utilisant la liste d'initialisation.

    D'autre part les deux codes ne sont pas à utiliser simultanément ! Leur resultat est identique, seul la manière de faire diffère.

    Si tu ne veux pas modifier ta class dridr, tu peux, vu que c'est une variable publique directement affecter une valeur à age :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    std::vector vec(2);
     
    //.... dans la boucle
    it->age = age;
    PS: Et essaye de faire l'effort d'utiliser la balise de code !!

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 24
    Par défaut
    Je n'ai egalement que quelques notions, mais si on reprend ton code initial (et en esperant repondre a ta question) :

    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
    //Librairies
    #include <iostream>         //entrée et sortie sur console
    #include <iomanip>          //manipulateur de donnée
    #include <stdlib.h>         // pour systeme
    #include <list>             // pour faire une liste
     
    using namespace std;
     
    //  class dridr
    class dridr
    {
        public:
        int age ;
     
        dridr (int pAge):age(pAge){};
        dridr ();
        ~dridr ();
     
    };
     
    //  fonction constructeur
    dridr::dridr()
    {
    age = 0;
    }
     
    //  fonction destructeur
    dridr::~dridr()
    {
     
     
    }
     
    //  Programme principale
    int main()
    {
    // ta liste
        list<dridr> lp;
     
     
        // deux objets dridr crees
        lp.insert(lp.begin() , dridr(20));
        lp.insert(lp.begin() , dridr(30));
     
     
     
        list<dridr>::iterator it; 
        for (it = lp.begin(); it != lp.end();it++)
        {
           std::cout << it->age << endl; // affichage des ages
        }
     
     
        system ("pause");
        return 0;
    }

  6. #6
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 10
    Par défaut Ca marche!
    Alors j'ai réussit à faire ce que je voulais.

    Merci pour votre aide!
    Dsl pour les balises [code] c'est la première fois que je poste sur le site...

    Dans mon code dans la boucle for d'affectation " il " va m'affecter le contenu de la variable local "age" à la variable "age" de l'objet 1 de ma classe dridr et après l'objet 2 de ma classe?

    c'est bien ça ??? (Pour être sur de bien comprendre...:).

    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
    71
    72
    73
    74
    75
    76
     
     
    //Librairies
    #include <iostream> //entrée et sortie sur console
    #include <iomanip> //manipulateur de donnée
    #include <stdlib.h> // pour systeme
    #include <vector> // pour faire un vector
     
    using namespace std;
     
    // class dridr
    class dridr
    {
        public:
        int age;
        string nom;
     
        dridr (int page,string pnom);
        ~dridr ();
     
    };
     
    // fonction constructeur
    dridr::dridr(int page,string pnom)
     
    {
     
     
    }
     
    // fonction destructeur
    dridr::~dridr()
     
    {
     
    }
     
    // Programme principale
    int main()
    {
     
        //variable local
        int age = 0;
        string nom;
     
     
        cout << "veuillez rentrer un age: ";
        cin >> age;
        cout << "veuillez rentrer un nom : ";
        cin >> nom ;
     
        //vector de 2 élément de type dridr
        vector<dridr> monvec(2,dridr(age,nom));
     
        //itérateur de mon vector
        vector<dridr>::iterator il;
     
        //crée 2 élément de vector de type dridr
        for (il = monvec.begin(); il != monvec.end();il++)
        {
            //affectation
            il->age = age;
            il->nom = nom ;
     
        }
     
        //affiche
        for (il = monvec.begin(); il != monvec.end();il++)
        {
           cout << "Mon age: "<<il->age << endl ; // affichage des ages
           cout << "Mon nom: "<<il->nom <<endl ; // affichage des nom
        }
     
        system ("pause");
        return 0;
    }

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 24
    Par défaut
    Je dirai que oui. A prendre avec des pincettes comme je debute moi meme.

    Ton iterateur fournit un pointeur sur ton ta liste (donc ligne 1, puis ligne 2).

    Pour chaque ligne avec -> tu pourras accéder aux methodes de ton objet dirdr
    alors que le . te permet d'acceder aux methodes de l'iterateur (begin, end etc...0

  8. #8
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 2
    Par défaut
    Je dirai plus exactement que ton iterateur (il) pointe sur un élément de ton vector (la case mémoire qui lui correspond) c'est donc un pointeur sur un des objet du vector (d'où l'utilisation de -> pour accéder à ses membres)


    Les fonctions begin() et end() sont des fonctions de ton vector (qui lui n'est pas un pointeur d'ou l'utilisation de "." pour accéder aux membres) renvoyant respectivement un iterator sur le premier élément et sur la fin du vecteur (pas le dernier élément mais le suivant) c'est pourquoi tu teste le fait que "il" n'est pas égale à l'iterator renvoyer par end et que tu t’arrête donc juste avant)

    Et le fait de faire il++ (soit dit en passant il me semble que faire ++il au lieu de il++ évite une copie supplémentaire du au fait que l'on à pas besoin de connaitre la valeur précédent l'incrémentation), fait avancer l'iterator sur l'adresse de l’élément suivant du vector.

    Voila en espérant avoir été clair et ne pas m'être trompé ^^

  9. #9
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 10
    Par défaut
    C'est a ce moment que les 2 objets sont créer?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vector<dridr> monvec(2,dridr(age,nom));
    Donc on peux afficher 1 des objet particulier en fonction de la valeur de iterator..?

  10. #10
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 10
    Par défaut [Résolu]
    C'est bon j'ai trouvé la réponse a ma question


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

Discussions similaires

  1. Liste d'objet : probleme avec la methode add
    Par Driktheviking dans le forum C#
    Réponses: 4
    Dernier message: 07/06/2011, 09h30
  2. Réponses: 28
    Dernier message: 09/09/2010, 17h27
  3. probleme conteneur <list> de la bibliotheque STL
    Par khaledmoez dans le forum C++
    Réponses: 2
    Dernier message: 06/12/2009, 18h48
  4. [AC-2007] formulaire liste avec objet
    Par polux dans le forum IHM
    Réponses: 5
    Dernier message: 17/09/2009, 16h39
  5. Réponses: 3
    Dernier message: 08/09/2005, 10h45

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