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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 43
    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 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
    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
    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
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 43
    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 chevronné Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    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]

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 43
    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?

+ 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