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 :

tableau d'objet à lire


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut tableau d'objet à lire
    Bonjour tous,

    1°) je suis arrivé après pas mal de difficultés à effectuer un tableau dynamique (vector) qui contiennent des objets.

    vectorA contient des objets Matrix: qui ont pour attributs
    - un string
    - un double
    - un int

    2°) Mon probleme est que j'aimerai lire à present certains cases de ce vector et connaitre les attributs des objets qu'il y a dedans.

    3°) Par exemple j'aimerai stocker le string dans une variable a, le double dans une variable b et afficher le int. Ceci pour l'avant dernière case de mon vectorA

    ==> j'ai donc pensé à quelque chose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    string a=vectorA.back(end-1);
    double b=vectorA.back(end-1);
    cout << vectorA.back(end-1) << endl;
    ==> mais il y a deux problemes:
    je ne sais pas/plus comment lui dire que je veux acceder à l'attribut 1,2 ou 3 de mon objet qui se trouve lui meme dans un vector

    et je me suis aperçu que la commadne (end-1) ne fonctionne pas es ce normal?

    j'espere que vous pourrez m'aider,

    merci d'avance

  2. #2
    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 tu veux accéder à un élément particulier de ton vecteur, tu peux parfaitement utiliser l'opérateur [], exactement comme tu l'aurais fait pour un tableau "C style" (pense que le premier élément du tableau prend l'indice 0 )

    A partir de là, si ta structure Matrix prend la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct Matrix
    {
        std::string str;
        double d;
        int i;
    };
    il "suffit" d'accéder au membre qui t'intéresse de manière strictement classique

    Cela te donnerait un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main()
    {
        std::vector<Matrix> tab;
        /* remplissage du vector, non représenté */
        std::cout<<"affiche la chaine du 3 eme element "<<tab[2].str<<std::endl
                 <<"affiche l'entier du 5eme "<<tab[4].i<<std::endl
                 <<"et le double du 10 eme "<<tab[10].d<<std::endl;
        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 éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    merci beaucoup d'avoir pris le temps de repondre.

    je me suis mal exprimé:
    - je n'ai pas de structure
    - j'ai des objets (avec trois attributs) qui se trouve eux meme dans un vector

    Je ne sais pas comment comment acceder aux attributs qu'il y a dans mon objet qui lui se trouve dans un vector




    voici un aperçu de mon objet et du vector

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    %remplissage de mon vecteur
    vectorA.push_back( Matrix (Name,Lattice,Atomic) )
     
    %la ligne ci dessus me met dans les derniere colonne du vector un objet de type matrix
    Matrix::Matrix(string _MatrixName, double _LatticeParameter, int_AtomicVolume)
    {
            MatrixName=_MatrixName;
            LatticeParameter=_LatticeParameter;
            AtomicVolume=_AtomicVolume;
    }

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    si je fais cela par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cout << vectorA[2] << endl;
    ca ne va pas afficher la valeur qu'il y a dans vectorA car pour moi il n'y a pas de valeur dans cette colonne mais un objet, et je souhaite d'ailleurs lire les attributs de cet objet

  5. #5
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par 21did21 Voir le message
    merci beaucoup d'avoir pris le temps de repondre.

    je me suis mal exprimé:
    - je n'ai pas de structure
    - j'ai des objets (avec trois attributs) qui se trouve eux meme dans un vector

    Je ne sais pas comment comment acceder aux attributs qu'il y a dans mon objet qui lui se trouve dans un vector




    voici un aperçu de mon objet et du vector

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    %remplissage de mon vecteur
    vectorA.push_back( Matrix (Name,Lattice,Atomic) )
     
    %la ligne ci dessus me met dans les derniere colonne du vector un objet de type matrix
    Matrix::Matrix(string _MatrixName, double _LatticeParameter, int_AtomicVolume)
    {
            MatrixName=_MatrixName;
            LatticeParameter=_LatticeParameter;
            AtomicVolume=_AtomicVolume;
    }
    Ta classe devrait dans ce cas contenir des accesseurs te permettant de retrouver ces valeurs :

    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
     
    %%% un extrait de la classe Matrix
    class Matrix
    {
    private:
      std::string m_name;
      int m_volume;
      double m_parameter;
    public:
      std::string get_name() const { return m_name; }
      int get_volume() const { return m_volume: }
      double get_parameter() const { return m_parameter; }
    };
     
    %%% une boucle sur chaque élément du vecteur : 
    for (std::size_t i=0; i<v.size(); ++i)
    {
      std::cout << "name = " << v[i].get_name() << std::endl;
      std::cout << "  volume = " << v[i].get_volume() << std::endl;
      std::cout << "  parameter = " << v[i].get_parameter() << std::endl;
    }
    v[i] te renvoie une référence (constante ou non, selon le cas) sur le ième élément du vecteur v. Tu peux accéder à l'objet de la même manière que si tu écrivait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Matrix& m = v[i]; // m est une référénce. 
    std::cout << "name = " << m.get_name() << std::endl;
    Tu peux aussi modifier les propriétés de la ième matrice de la même manière - en prévoyant ce qu'on appelle communément des mutateurs - ou improprement des setters, parce que généralement leur nom est set_quelque_chose(...). Ce n'est pas nécessairement une bonne idée, mais je te l'indique pour t'aider à comprendre que v[i] est une référence - pas une copie de la matrice manipulée.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    merci beaucoup j'ai bien compris la premiere partie (2nd un peu moins mais c pas grave).

    en fait je pensais qu'il y avait beaucoup plus simple que d'etre obligé de faire une fonction pour lire un attribut (j'avais oublié ces notions d'accesseurs)

    ==> par contre comment expliquer que la commande v[end] ne fonctionne pas?

  7. #7
    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
    En fait, les différence qu'il peut y avoir entre les structures et les classes sont minimes en C++ et tiennent exclusivement dans l'accessibilité par défaut des membres et de l'héritage.

    Par défaut, les membres et l'héritage d'une structure seront publiques alors qu'ils seront privé pour les classes

    Tu me dis que tu n'as pas de structures, mais les objets que tu crées ont bien un type et sont donc soit des classes, soit des structures

    Selon l'accessibilité que tu donnes au membres de ta classe ou de ta structure, il te sera possible, ou non, d'y accéder "depuis l'extérieur" (comprends: depuis une fonction non membre de ta classe / structure).

    Si tu les déclares dans une accessibilité autre que publique, mais qu'il te semble intéressant de pouvoir en obtenir la valeur "depuis l'extérieur", il faudra sans doute recourir à un accesseur ("getter") , alors que s'ils sont publiques, n'importe qui pourra y accéder, mais également décider de les modifier sans possibilité de contrôler le fait que les modifications soient opportunes et cohérentes.

    Pour ce qu'il en est de l'affichage, il faut comprendre que le compilateur ne peut en aucun cas décider de m'ordre et de la manière d'afficher les membres de ta structure ou de ta classe.

    Tu dois donc, au choix, exprimer explicitement la manière et l'ordre dans lesquels tu souhaite qu'il les affiche.

    Si tu souhaite n'afficher que certains attributs à des moments bien particuliers, tu devra recourir aux accesseurs (si les membres sont privés ou protégés) ou accéder directement à l'attribut souhaité (s'il est public).

    Mais si tu souhaite que l'affichage reprenne systématiquement un certain nombre d'attribut dans un certain ordre et sous une forme particulière, tu peux également envisager de surcharger l'opérateur << pour ta classe ou ta structure.

    Au final, tu as deux solutions pour utiliser tes objets:

    Soit tu définis une classe (ou une structure) dans laquelle les attribut sont publiques, comme ce que je t'ai présenté lors de mon premier message, soit tu définis une classe (ou une structure) dans laquelle les attributs sont privés, mais tu fournis les fonctions "qui vont bien" pour en récupérer la valeur, sous une forme proche 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
    class Matrix
    {
        public:
            /* on conseille d'utiliser plutôt les listes d'initialisation */
            Matrix(string _MatrixName, double _LatticeParameter, 
                   int_AtomicVolume):MatrixName(_MatrixName),
                LatticeParameter(_LatticeParameter),
                AtomicVolume(_AtomicVolume)
            {    
            }
            std::string const & name() const{return MatrixName;}
            double latice() const{return LaticeParameter;}
            int volume() const {return AtomicVolume;}
        private:
            std::string MatrixName;
            int AtomicVolume;
            double LaticeParameter;
    };
    A partir de là, tu as, de nouveau deux solutions :
    Soit tu utilise les accesseurs pour afficher l'attribut qui te convient, sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    std::cout<<tab[2].name();
    std::cout<<tab[46].latice();
    std::cout<<tab[3].volume();
    soit tu surcharge l'opérateur << pour le faire directement.

    La classe devient alors proche 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
    class Matrix
    {
        public:
            /* on conseille d'utiliser plutôt les listes d'initialisation */
            Matrix(string _MatrixName, double _LatticeParameter, 
                   int_AtomicVolume):MatrixName(_MatrixName),
                LatticeParameter(_LatticeParameter),
                AtomicVolume(_AtomicVolume)
            {    
            }
            std::string const & name() const{return MatrixName;}
            double latice() const{return LaticeParameter;}
            int volume() const {return AtomicVolume;}
            friend ostream & operator <<(ostream & ofs, Matrix const & m)
            {
                ofs<<" nom de la matrice :"<<MatrixName<<std::endl
                   <<"Parametre de latence :"<<LatticeParameter<<std::endl
                   <<"Volume atomique :"<<AtomicVolume<<std::endl;
            }
        private:
            std::string MatrixName;
            int AtomicVolume;
            double LaticeParameter;
    };
    Tu pourra alors demander directement l'affichage de ta matrice sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout<<tab[51];// affiche les informations relatives au 52 eme élément
    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

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    merci beaucoup pour votre aide, ca fait un moment que j'avais pas fait de C++ et j'avais oublié ces notions

    à présent mon programme fonctionne super bien, j'ai utilisé les accesseur car j'étais habitué à cela avant

    par contre j'etais persuadé que cela fonctionné

    cout << "name = " << MatrixList[end-1].get_Name() << endl;

    mais ca ne fonctionne pas pour lire l'avant dernière case, c'est normal?

    ==> ce n'est pas très grave je peux faire quelque chose d'equivalent avec size() mais ca m'intrigue : dans quel cas peut on utiliser end si ce n'est pas avec les tableau

  9. #9
    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 21did21 Voir le message
    ==> par contre comment expliquer que la commande v[end] ne fonctionne pas?
    Parce que end ne représente rien...

    tu dispose bel et bien d'une fonction membre end() pour la classe vector, mais elle renvoie un itérateur sur ce qui suit le dernier élément du vector, et non une quelconque valeur qui pourrait servir pour déterminer un indice

    La notion d'itérateur est particulière en cela que ce n'est pas l'objet contenu dans ta collection, mais "quelque chose" qui permet, simplement, de parcourir , éventuellement dans les deux sens, l'ensemble des éléments de la collection

    C'est d'ailleurs la raison pour laquelle on leur donne généralement une sémantique de pointeur, car, pour accéder à l'élément en lui-même, il s'agit de déréférencer l'itérateur ou d'utiliser l'opérateur ->, sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for(std::vector<Matrix>::iterator it=tab.begin();it!=tab.end();++it)
    {
        std::cout<<it->name();
       /* OU OU OU */
       std::cout<< (*it).name();
    }
    [EDIT]Pour qu'un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << "name = " << MatrixList[end-1].get_Name() << endl;
    puisse fonctionner, il faudrait que end soit une valeur numérique entière qui puisse être considérée comme étant un index (et correspondant, à en juger par le nom que tu lui donne et l'utilisation que tu en fait, au nombre d'éléments qui se trouve dans MatrixList)
    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

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    merci pour ces precisions

    (pas tres facile tout cela pour un debutant comme moi)


    en tout cas mon probleme est résolu et je vous en remercie enormement

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

Discussions similaires

  1. [PHP 5.4] Impossible de lire un tableau d'objets stocké dans $_SESSION
    Par Leilou dans le forum Langage
    Réponses: 2
    Dernier message: 02/11/2013, 12h43
  2. [POO] Lire un tableau d'objets
    Par Invité dans le forum Langage
    Réponses: 4
    Dernier message: 23/05/2008, 16h49
  3. Sauvegarde / Chargement d'un tableau d'objets
    Par Naruto dans le forum Langage
    Réponses: 3
    Dernier message: 18/05/2004, 14h34
  4. [VB6]Tableau d'objet withevents
    Par soazig dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 13/02/2004, 19h44
  5. [VB6] [Syntaxe] Fonction renvoyant un tableau d'objets
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/10/2002, 15h33

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