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 lecture Deque de pointeurs sur objet


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 43
    Points : 30
    Points
    30
    Par défaut problème lecture Deque de pointeurs sur objet
    Bonjour à tous,

    Je suis entrain de me battre avec l'utilisation de deque... Je vois pas ou je fais une erreur... lors de la relecture ça m'affiche uniquement le dernier éléments introduit (autant de fois qu'il y a d'éléments).

    Voici ma classe Perso (j'utilise "DemanderPerso" pour le remplir et "AfficherPerso" pour l'affichage):
    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
    77
    78
    79
    80
    81
    82
    83
    #include<iostream>
    #include<fstream>
    #include<string.h>
     
    #include "Classe.h"
     
    using namespace std;
     
    unsigned long Perso::compteur=0l;
     
    Perso::Perso()								//Contructeur
    {
    	id=++compteur;
    	pnom=new char [MAXLEN_NOM+1];			//alloue MAXLEN+1 à pnom 
    	memset (pnom, 0, MAXLEN_NOM+1);			//Remplit les MAXLEN+1 cases de pnom avec des 0
    	sante=100;
    	exp=0;
    	classe=0;
    	//pnext=pprev=NULL;
    }
     
    Perso::~Perso(void)							//Destructeur
    {
    	delete[]pnom;
    }
     
    Perso::Perso(Perso &source)
    {
    	if(&source==this)return;
     
    	pnom=new char [MAXLEN_NOM+1];
    	strcpy(pnom,source.pnom);
    	exp=source.exp;
    	compteur=source.compteur;
    	sante=source.sante;
    	classe=source.classe;
    }
     
    Perso& Perso::operator= (Perso& source)
    {
    	if(&source == this) return(*this);
     
    	strcpy(pnom,source.pnom);
     
    	exp=source.exp;
    	compteur=source.compteur;
    	sante=source.sante;
    	classe=source.classe;
     
    	return(*this);
    }
     
     
     
    void Perso::AfficherPerso(Perso* aPerso)
    {
    	cout<<"Nom: "<<pnom<<endl;
    	cout<<"Experience: "<<exp<<endl;
    	cout<<"ID: "<<id<<endl;
    	cout<<"Sante: "<<sante<<endl;
    	cout<<"Classe: "<<classe<<endl;
    	cout<<"Force: "<<force<<endl;
    	cout<<"Agilite: "<<agilite<<endl;
    	cout<<"Intelligence: "<<intell<<endl;
    	cout<<"----------------------------------------"<<endl;
    }
     
    void Perso::DemanderPerso(Perso* aPerso)
    {
    	int buflen = aPerso->MAXLEN_NOM;
    	cout<<"Creation"<<endl<<endl;
    	cout<<"Nom:";
    	cin.ignore();							//vide le choix du menu, vide le buffer
    	cin.getline(aPerso->pnom, buflen);
    	aPerso->pnom[buflen+1];
    	cout<<"Entrez force: ";
    	cin>>force;
    	cout<<"Entrez agilite: ";
    	cin>>agilite;
    	cout<<"Entrez Intelligence: ";
    	cin>>intell;
     
    }
    Voici mon main:

    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
    #include "Classe.h"
    #include <deque>
     
    using namespace std;
    void main ()
     
    {
     
    	Perso* ptrav=NULL;
    	ptrav=new Perso;	
     
     
    	deque<Perso*> dpperso;	//déclaration deque pointeur sur objet
    	deque<Perso*>::iterator ipb;
     
     
     
          ptrav->DemanderPerso(ptrav);	//remplir deque objet
    	dpperso.push_back(ptrav);
    	ptrav->DemanderPerso(ptrav);
    	dpperso.push_back(ptrav);
     
     
     
    	system("cls");
     
     
    	for(ipb = dpperso.begin(); ipb != dpperso.end(); ipb++) //affichage deque objet //pas OK
    	{
    		ptrav->AfficherPerso(*ipb);
    	}
     
     
     
    	cout<<"la deque a " <<dpperso.size()<<" elements"<<endl;
     
    	system("pause");
     
    }
    Merci d'avance pour votre aide!

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

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    C'est bizarre ta conception...
    J'utiliserai plutôt une fonction membre Afficher() dans la classe Perso.

    Et après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(ipb = dpperso.begin(); ipb != dpperso.end(); ipb++) 
    {
    	ipb->Afficher();
    }
    Non ?

  3. #3
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Tes méthodes sur Perso::AfficherPerso et Perso:emanderPerso s'applique sur un objet Perso (elles ne sont visiblement pas statiques) et prennent en paramètre un pointeur sur Perso ? Ensuite elle mélange sans trop de cohérence la lecture/la modification des membres de l'objet et celui du paramètres. Il faut choisir. Enfin, pourquoi utiliser un char* pour ta chaîne de caractère et non un std::string ?

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 43
    Points : 30
    Points
    30
    Par défaut
    Voila c'est résolu:

    J'ai modifié mes fonctions afficher et demander, mais le gros problème etait que j'écrivait tous le temps dans le même espace memoire... il fallait mettre ptrav=new perso; dans la boucle pour allouer un nouvel espace à chaque fois

    .cpp:
    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
    77
    78
    79
    80
    81
    82
    83
    #include<iostream>
    #include<fstream>
    #include<string.h>
     
    #include "Classe.h"
     
    using namespace std;
     
    unsigned long Perso::compteur=0l;
     
    Perso::Perso()								//Contructeur
    {
    	id=++compteur;
    	pnom=new char [MAXLEN_NOM+1];			//alloue MAXLEN+1 à pnom 
    	memset (pnom, 0, MAXLEN_NOM+1);			//Remplit les MAXLEN+1 cases de pnom avec des 0
    	sante=100;
    	exp=0;
    	classe=0;
    	//pnext=pprev=NULL;
    }
     
    Perso::~Perso(void)							//Destructeur
    {
    	delete[]pnom;
    }
     
    Perso::Perso(Perso &source)
    {
    	if(&source==this)return;
     
    	pnom=new char [MAXLEN_NOM+1];
    	strcpy(pnom,source.pnom);
    	exp=source.exp;
    	compteur=source.compteur;
    	sante=source.sante;
    	classe=source.classe;
    }
     
    Perso& Perso::operator= (Perso& source)
    {
    	if(&source == this) return(*this);
     
    	strcpy(pnom,source.pnom);
     
    	exp=source.exp;
    	compteur=source.compteur;
    	sante=source.sante;
    	classe=source.classe;
     
    	return(*this);
    }
     
     
     
    void Perso::AfficherPerso()
    {
    	cout<<"Nom: "<<pnom<<endl;
    	cout<<"Experience: "<<exp<<endl;
    	cout<<"ID: "<<id<<endl;
    	cout<<"Sante: "<<sante<<endl;
    	cout<<"Classe: "<<classe<<endl;
    	cout<<"Force: "<<force<<endl;
    	cout<<"Agilite: "<<agilite<<endl;
    	cout<<"Intelligence: "<<intell<<endl;
    	cout<<"----------------------------------------"<<endl;
    }
     
    void Perso::DemanderPerso()
    {
    	int buflen = MAXLEN_NOM;
    	cout<<"Creation"<<endl<<endl;
    	cout<<"Nom:";
    	cin.ignore();							//vide le choix du menu, vide le buffer
    	cin.getline(pnom, buflen);
    	pnom[buflen+1];
    	cout<<"Entrez force: ";
    	cin>>force;
    	cout<<"Entrez agilite: ";
    	cin>>agilite;
    	cout<<"Entrez Intelligence: ";
    	cin>>intell;
     
    }
    main:
    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
    	#include "Classe.h"
    #include <vector>
     
    using namespace std;
    void main ()
     
    {
    	Perso* ptrav=NULL;
     
     
     
    	vector<Perso*> dpperso;											//déclaration vector pointeur sur objet
    	vector<Perso*>::iterator ipb;
     
    	for(int i=0;i<3;i++)
    	{
    	ptrav=new Perso;
    	ptrav->DemanderPerso();
    	dpperso.push_back(ptrav);
    	}
     
    	system("pause");
     
    	for(ipb = dpperso.begin(); ipb != dpperso.end(); ipb++)			//affichage vector objet //pas OK
    	{	
    		(*ipb)->AfficherPerso();
    	}
     
    	cout<<"le vecteur a " <<dpperso.size()<<" elements"<<endl;
     
    	system("pause");
    	delete ptrav;
    }
    Merci pour votre aide, cependant, maitenant que j'ai "bien" compris le fonctionnement j'ai un autre problème. J'aimerais faire une classe avec mon vecteur... j'ai parcouru le net à la recherche de tuto, mais en vain... Si il y un âme charitable qui pourrait m'expliquer ce serait super

    Merci d'avance.

  5. #5
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    Bonjour,
    Quand tu utilises un vector, il faut toujours penser que c'est très très proche d'un tableau en C. Et que donc dans pas mal de cas on a pas besoin d'utiliser les iterateurs :p
    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
    // Création du vector de perso :
    const size_t NombreDePerso = 3;
    std::vector<Perso*> PersoVector(NombreDePerso); // On créé un vector avec dedans NombreDePerso pointeur sur des perso
    // Creation des persos
    for (size_t i = 0, i < PersoVector.size(), ++i)
    {
        PersoVector[i] = new Perso; // On allou la mémoire pour chaque perso
        PersoVector[i]->DemanderPerso(PersoVector[i]); // C'est très étrange qu'un objet ai besoin de lui même en argument (je ne fait que de transposer ton code)
    }
    // A cette ligne, tu as un vector avec des persos dedans
     
    // La tu fais ce que tu veux avec tes perso
    for(size_t i = 0, i < PersoVector.size(), ++i) // Affichage des perso
    {	
        PersoVector[i]->AfficherPerso();
    }
     
    // Maintenant tu veux les détruire, il faut que tu détruises tous les perso qui sont dans le vector
     
    for (size_t i = 0, i < PersoVector.size(), ++i)
    {
        delete PersoVector[i]; // On efface chaque perso
    }
    PersoVector.clear(); // On vide le vector de tout ses pointeurs (qui ne pointent sur rien maintenant)
     
    // Voila a plus de traces
    [Troll=on]
    VIVE LES POINTEURS INTELLIGENTS !!!!!!!!
    [Troll=off]
    Première grosse démo en construction :
    http://bitbucket.org/rafy/exo2/

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 43
    Points : 30
    Points
    30
    Par défaut
    Merci pour ta réponse,

    si j'utilise des itérateurs c'est parce que c'est un projet scolaire et que je doit respecter le cahier des charges.

    Pour ce qui est de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PersoVector[i]->DemanderPerso(PersoVector[i]);
    t'as raison c'etait inutile, tu remarquera d'ailleur que j'ai modifier ça dans ma solution finale.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ptrav=new Perso;
    ptrav->DemanderPerso();
    dpperso.push_back(ptrav);
    J'essaie toujours de créer un classe avec mon vector et ne plus faire la déclaration dans le main mais je calle complètement... Enfin je suppose que c'est possible.

    Personne peut m'aider?

  7. #7
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par gonzo59 Voir le message
    J'essaie toujours de créer un classe avec mon vector et ne plus faire la déclaration dans le main mais je calle complètement... Enfin je suppose que c'est possible.
    Quel est ton problème exactement ? Tu ne sais pas déclarer un membre ?

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

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Idem, j'ai pas compris la question. Créer une classe avec un vector, ça ne veut rien dire pour moi...

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 43
    Points : 30
    Points
    30
    Par défaut
    veuillez excuser mon ignorance je suis débutant...

    en gros pour le moment je déclare le vecteur dans mon main avec un include de vector:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include <vector>
    vector<Perso*> dpperso;											//déclaration vector pointeur sur objet
    	vector<Perso*>::iterator ipb;
    N'y a t'il pas moyen de le faire avec un .cpp et un .h

    le .h ressemblerait à ça:
    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
    #ifndef CONTENEUR_PERSO_H
    #define CONTENEUR_PERSO_H
     
    #include <vector>
     
    using namespace std;
     
    class conteneurp{
    private:
     
     
    public:
    	void ajouter (void);
    	void lister (void);
    };
     
    #endif

  10. #10
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Premier conseil : On ne met pas de using namespace dans un .h
    Ensuite, n'as-tu pas appris à l'école comment déclarer un membre dans une classe ? La démarche est la même pour le vecteur. Comment as-tu essayé de faire ?

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 43
    Points : 30
    Points
    30
    Par défaut
    j'ai essayé comme ça:

    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
    #ifndef CONTENEUR_PERSO_H
    #define CONTENEUR_PERSO_H
     
    #include "Perso.h"
    #include "fichier.h"
     
    #include <vector>
     
     
     
    class conteneurp{
     
    protected:
    	vector<Perso*> dpperso;											//déclaration vector pointeur sur objet
    	vector<Perso*>::iterator ipb;
     
    public:
    	void ajouter (void);
    	void lister (void);
    	void remplir (void);
    };
     
    #endif
    Pour y accéder depuis le main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	conteneurp cont;
    	cont.dpperso.push_back;
    Mais j'ai une erreur de compile qui me dit que je saurais pas accéder à un protected de la classe conteneurp.

  12. #12
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Tu as combien eu combien de cours C++ ? Commence à mon avis par faire un tour sur la page des tutoriels.

    Un membre est protégé pour qu'il ne soit accessible qu'à la classe et à ses classes dérivées. Dans ton exemple, le membre devrait probablement être private. Comment y accéder ? La logique est plutôt que tu encapsule ton besoin dans la classe et que ce soit celle-ci qui accède au membre et le modifie. Dis autrement, une classe ne se définit pas par les membres qu'elle contient mais par les opérations qu'elle supporte.

    Prenons un exemple. Définissons une classe CPoint avec 2 coordonnées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class CPoint
    {
    private :
       int m_x;
       int m_y;
    };
    Si tu veux modifier les attributs de m_x et m_y, alors tu devrais avoir une méthode pour cela :
    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
     
    // .h
    class CPoint
    {
       CPoint();
       void AllerA(int nouveau_x_, int nouveau_y_);
    private :
       int m_x;
       int m_y;
    };
     
    // .cpp:
    CPoint::CPoint() // constructeur pour initialiser par défaut.
    :m_x(0),m_y(0)
    {
    }
    void CPoint::AllerA(int nouveau_x_, int nouveau_y_)
    {
       m_x = nouveau_x_;
       m_y = nouveau_y_;
    }
    // main.cpp :
    int main()
    {
       CPoint point;
       point.AllerA(2,3);
    }

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

Discussions similaires

  1. pointeurs sur objets en C #
    Par lemya dans le forum C#
    Réponses: 3
    Dernier message: 02/01/2008, 12h13
  2. Pointeur sur objet different
    Par peruvio dans le forum C++
    Réponses: 4
    Dernier message: 19/11/2007, 20h06
  3. Pointeur sur objet
    Par bubulemaster dans le forum Débuter
    Réponses: 5
    Dernier message: 26/09/2007, 09h10
  4. Tableau de pointeurs sur objets
    Par bassim dans le forum C++
    Réponses: 11
    Dernier message: 13/12/2005, 19h45
  5. [Debutant VC++.net] Obtenir un pointeur sur objet
    Par SteelBox dans le forum MFC
    Réponses: 6
    Dernier message: 17/06/2004, 18h36

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