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 :

c++ probleme d'affichage d'une variable membre d'un objet


Sujet :

C++

  1. #1
    Membre du Club Avatar de alexorcet
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Points : 50
    Points
    50
    Par défaut c++ probleme d'affichage d'une variable membre d'un objet
    Bonsoir à tous
    mon programme consiste à creer des pieces(classe Piece) chaque piece a un identifiant(classe Identifiant).

    class PieceMusee
    {
    private:

    Identifiant id;
    char category[SIZE];
    char description[SIZE];

    etc........

    j'ai une methode Encode() qui retourne une Piece
    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
    Piece Piece::Encode()
    {
     	PieceMusee p;
         	cout<<"--------------Encodage de la piece-----------"<<endl;
     
    	Identifiant i;
    	char l;int a;
    	cout<<"Inserer la lettre de l'id alphanumerique de la piece"<<endl;
    	cin>>l;
    	i.setLettre(l);
    	cout<<"Quelle est son annee d acquisition?"<<endl;
    	cin>>a;
    	i.setAnnee_dacq(a);
    	p.setIdentifiant(i);
     etc.....
    return p;
    Le probleme se pose qd je veux afficher l'id de la piece avec ailleur de la methode encode().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout<<"---l'id de la Piece est"<<p.id<<endl;
    il me donne comme resultat l'id que j'ai mis dans mon constructeur par defaut.

    d'ou pourrai venir le probleme???

    Ma 2éme question comment je peux faire un cin>>sur une chaine de caracteres qui contient un espace car avec cin>>machaine il me coupe tout apres l'espace.

  2. #2
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    1- Lis les valeurs nécessaire à la construction de ton objet. Et ensuite construit directement ton objet.

    2- laisse tomber les les tableaux statiques de caractères. C++ a un type standard pour les chaînes de caractères -> std::string. Utilise std::getline pour lire des lignes en ignorant les espaces.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Si une méthode appartient à une classe donnée (comme c'est le cas de ta méthode Encode()) tu dispose d'un pointeur sur l'objet réel du type de ta classe...

    Ce pointeur est this et peut etre sous-entendu quand tu veux simplement modifier la valeur d'un membre de l'objet en cours.

    Donc, tu n'a nullement besoin de créer un nouvel objet dans la méthode, et qui plus est, surement pas un objet statique ainsi que tu le fait...

    La définition de ta classe aurait fortement avantage à se transformer en quelque chose du genre de
    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
     
    class PieceMusee
    {
        private:
            Identifiant id;
            std::string category;
            std::string description;
        public:
            //constructeur par défaut
            PieceMusee(){}
            //constructeur avec les informations necessaires
            PieceMusee(Identifiant i,const std::string& cat, 
                       const std::string& desc): id(i), category(cat), 
                       description(desc){}
            //le destructeur
            ~PieceMusee(){}
            //la methode d'encodage (renvoie une référence sur l'objet en cours)
            PieceMusee& Encode();
        //le reste des déclarations
    (j'ai gardé sensiblement le meme prototype pour la méthode, mais, comme elle s'applique à un objet, il pourrait ne rien renvoyer et modifier directement les membres qu'il contient
    La méhtode Encode serait codée sous la forme de (j'ai pris ton code, à la base
    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
     
    PieceMusee& Encode()
    {
        char l;
        cout<<"Inserer la lettre de l'id alphanumerique de la piece"<<endl;
        cin>>l;
        //on a acces au membre id... donc si les identifiant ont une méthode
        //setLetre, on peut faire
        id.setLettre(l);
        //cela revient exactement au meme si on fait
        this->id.setLettr(l);
        int annee;
        cout<<"Quelle est son annee d acquisition?"<<endl;
        cin>>a;
        //meme remarque que plus haut ;)
        id.setAnnee_dacq(a);
        //on renvoie ce qui est pointé par this
    //...
        return *this;
    }
    Une autre solution serait, dans la fonction qui a besoin d'une variable PieceMusee, de travailler sous la forme de
    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
     
    void MaFonct_qui_cree_un_objet_PieceMusee()
    {
        //ici, on a besoin d'un identifiant
        char l;
        cout<<"Inserer la lettre de l'id alphanumerique de la piece"<<endl;
        cin>>l;
        Identifiant i;
        i.setLettre(l);
        int annee;
        cout<<"Quelle est son annee d acquisition?"<<endl;
        cin>>a;
        i.setAnnee_dacq(a);
        //Tant qu'a faire, on demande la categorie et la description
        std::cout<<"Veuillez introduire la catégorie de la piece ";
        std::string cat;
        std::cin>>cat;
        std::cout<<"Veuillez introduire la description de la piece ";
        //typiquement, une description fait plusieurs mots, on est mieux 
        //d'utiliser getline() ;)
        std::string desc;
        std::getline(std::cin,desc);
        //on appelle maintenant le constructeur avec toutes les données 
        //qu'on a récupérées
        PieceMusee lapiece(i,cat,desc);
        //ou, s'il faut une allocation dynamique (n'oublie pas qu'il faudra 
        //le detruire avec delete ;) ):
        PieceMusee *PLaPiece=new PieceMusee(i,cat, desc);
    //on continue à travailler sur lapiece ;)
    }
    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

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Ceci dit, d'apres le code que tu fournis, l'identifiant n'est constitué que d'une lettre et d'un entier...

    Deux choses sont à prendre en compte à son sujet:

    -une lettre, ca peut etre un peu court pour servir d'identifiant (à moins que l'identifiant final soit "l'union" de la lettre et de la date (A20061230 B20061230 A20070116...), car, tu ne dispose que de relativement peu de caractère imprimables certains, et que je serais surpris que le musée n'aie "que", meme en criant fort, 255 pieces

    -De prime abord, ni la lettre, ni le nombre qui sert de date n'est susceptible d'etre modifié apres sa création... Tout ce dont tu risque d'avoir besoin, au niveau de l'identifiant, c'est de récupérer la lettre (ou la chaine) et le nombre (voire, une chaine unissant la lettre et le nombre)...

    Il parraitrait donc intéressant d'envisager de réétudier un peu la question de ta conception de l'identifiant...

    La classe qui me *semble* (sous réserve que j'aie bien compris le role et le contenu de ton identifiant) le plus adéquat serait quelque chose du genre de
    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
     
    class Identifiant
    {
        private:
            //les membres je remplace la lettre (unique) par une chaine, pour 
            //le cas où de nombreuses pieces arriveraient le meme jour ;)
            std::string lettres;
            int date_aquis;
            //on interdit le constructeur par defaut (sans valeur)
            Identifiant(){}
        public:
            //Le constructeur qu'il est obligatoire d'utiliser
            Identifiant(const std::string& ch, int aquis): lettres(ch),
                        date_aquis(aquis){}
            //récupération de la chaine seule
            std::string GetLettre(){return lettres;}
            //récupération du nombre seul
            int GetDate(return date_aquis;}
            //récupération d'une chaine qui contient lettres et date_aquis
            std::string GetAll()
            {
                    std::string retour;
                    retour=lettres;
                    //il faut passer par un ostringstream pour convertir le nombre
                    // en chaine
                    std::ostringstream oss;
                    oss<<lettres;
                    retour+=oss.str();
                    return retour;
            }
    }
    Evidemment, tu es libre de choisir parmis ces trois méthodes lesquelles te sont utiles, ainsi que leur nom (et, d'ailleurs, le nom des membres aussi )...

    Elles ne sont là que pour te servir d'exemple

    Certains operateurs de comparaisons pourraient d'ailleurs aussi s'avérer utiles, pour le tri et/ou pour s'assurer de l'unicité de l'identifiant
    La création d'un identifiant se fera d'office, apres avoir récupéré les informations nécessaires, en utilisant le constructeur fournit sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        std::string l;
        cout<<"Inserer la chaine alphanumerique servant d'identifiant à la piece"<<endl;
        cin>>l;
        int n;
        cout<<"Quelle est son annee d acquisition?"<<endl;
        cin>>a;
        //on a tout, on peut créer l'identifiant
        Identifiant id(l,a);
        //pour l'utiliser, par exemple plus tard, en appelant le constructeur pour 
        //la piece recue ;)
    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

  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Points : 403
    Points
    403
    Par défaut
    Bonsoir ,

    koala01, je me demande ce que ce code signifie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    std::string GetAll()
            {
                    std::string retour;
                    retour=lettres;
                    //il faut passer par un ostringstream pour convertir le nombre
                    // en chaine
                    std::ostringstream oss;
                    oss<<lettres;
                    retour+=oss.str();
                    return retour;
            }
    Il va y avoir deux fois lettres dans retour qui ne sert à rien, de plus return oss.str() suffit, et le nombre n' est pas injecté dans le flux.

    Cordialement.

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par dj.motte
    Bonsoir ,

    koala01, je me demande ce que ce code signifie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    std::string GetAll()
            {
                    std::string retour;
                    retour=lettres;
                    //il faut passer par un ostringstream pour convertir le nombre
                    // en chaine
                    std::ostringstream oss;
                    oss<<lettres;
                    retour+=oss.str();
                    return retour;
            }
    Il va y avoir deux fois lettres dans retour qui ne sert à rien, de plus return oss.str() suffit, et le nombre n' est pas injecté dans le flux.

    Cordialement.
    De fait... j'étais distrait....
    L'ostringstream, il était destiné à recevoir date_aquis
    Le code modifié:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    std::string GetAll()
            {
                    std::string retour;
                    retour=lettres;
                    //il faut passer par un ostringstream pour convertir le nombre
                    // en chaine
                    std::ostringstream oss;
                    oss<<date_aquis;
                    retour+=oss.str();
                    return retour;
            }
    voire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    std::string GetAll()
            {
                    std::string retour;
                    //il faut passer par un ostringstream pour convertir le nombre
                    // en chaine
                    std::ostringstream oss;
                    oss<<lettres<<date_aquis;
                    retour+=oss.str();
                    return retour;
            }
    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

  7. #7
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Points : 403
    Points
    403
    Par défaut
    Bonsoir,

    koala01, il me semble que votre code pourait être simplifié .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    std::string GetAll()
            {       std::ostringstream oss;
                    oss<< lettres<< date_aquis;
                    return oss.str();
            }
    On peut faire l' inverse en mettant la date avant 'lettres'.
    Mais dans une situation ou une paire ( T, V ) ou ( V , T ) d' autres choix auraient pu être possibles, mais je ne tiens pas à chambouler le choix du demandeur.

    Cordialement.

  8. #8
    Membre du Club Avatar de alexorcet
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Points : 50
    Points
    50
    Par défaut
    Merci bcp les garrs.
    j'ai utilisé vos solutions et tout fonctionne super bien.

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

Discussions similaires

  1. Problem d'affichage d'une variable
    Par Melolu dans le forum Bibliothèque standard
    Réponses: 1
    Dernier message: 25/06/2008, 21h57
  2. Réponses: 8
    Dernier message: 21/02/2008, 15h30
  3. Réponses: 10
    Dernier message: 12/07/2006, 11h42
  4. Réponses: 4
    Dernier message: 14/12/2005, 08h33
  5. Réponses: 13
    Dernier message: 14/06/2003, 22h15

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