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 :

prob parcours map clé pointeur


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Developpeur
    Inscrit en
    Septembre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Septembre 2004
    Messages : 114
    Par défaut prob parcours map clé pointeur
    Boonjour à tous et bonne année,

    J'aimerais avoir votre aide concernant un problème auquel je suis confronté actuellement en c++.
    J'ai une map définie de la facon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef map<Quantite*, Ingredient*> quantite_ingredient_map;
    Dans ma classe Recette j'ai un attribut de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    quantite_ingredient_map _m;
    Pour ajouter dedans j'utilise cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void Recette :: ajouter_composant(Quantite* q,Ingredient* i){     
         _m.insert(make_pair(q,i));
    }
    Mon problème survient lorsque je souhaite parcourir ma map de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	if( !_m.empty() ) {
        	quantite_ingredient_map::iterator itt;
             for (itt = _m.begin(); itt != _m.end(); itt++) {
        		((*itt).first).afficherDec(os,1);
        	}
        }
    J'ai le droit d'avoir cette magnifique erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     no match for 'operator=' in 'itt = (((const quantite_ingredient_map*)((const Recette*)this)) + 20u)->std::map<_Key, _Tp, _Compare, _Alloc>::begin [with _Key = Quantite*, _Tp = Ingredient*, _Compare = std::less<Quantite*>, _Alloc = std::allocator<std::pair<Quantite* const, Ingredient*> >]()'
    Là je suis complètement bloqué depuis 2h et je ne comprends pas d'où peut venir ce problème.

    Merci d'avance à tous ceux qui prendront le temps de me lire et de me répondre.

    Louis

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Bonjour,
    pour commencer une map où la clef et un pointeur... ca ne doit etre ce que tu veut faire.... Il va etre trié en fonction de l'adresse du pointeur....

    sinon,
    (*itt).first est un pointeur donc :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    quantite_ingredient_map::iterator itt;
    for (itt = _m.begin(); itt != _m.end(); itt++) 
        		(*itt).first->afficherDec(os,1);

  3. #3
    Membre confirmé
    Profil pro
    Developpeur
    Inscrit en
    Septembre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Septembre 2004
    Messages : 114
    Par défaut
    Oui mais le tri n'est pas une priorité, il me faut jsute une liste d'ingrédient associé à des quantités.

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par allserv Voir le message
    Oui mais le tri n'est pas une priorité, il me faut jsute une liste d'ingrédient associé à des quantités.
    Comme le trie ne te sert a rien, utilise un vector de pair. La si tu veut associé deux Ingredient a une même instance d'une Quantite ca ne marchera pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector< std::pair<Quantite*, Ingredient*> > quantite_ingredient_association;
    Pourquoi doit tu utiliser des pointeur???

  5. #5
    Membre confirmé
    Profil pro
    Developpeur
    Inscrit en
    Septembre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Septembre 2004
    Messages : 114
    Par défaut
    J'utilise des pointeurs car en fait il est impossible d'instancier un objet de type Quantité, il s'agit d'une classe qui est utilisée pour dériver tous les autres types (gramme, litre etc..). Or si je me souviens bien des erreurs que j'ai pu avoir, il était impossible de passer par référence un objet de type Quantité car il fallait qu'il soit instancié.

    Je me trompe ?

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par allserv Voir le message
    J'utilise des pointeurs car en fait il est impossible d'instancier un objet de type Quantité, il s'agit d'une classe qui est utilisée pour dériver tous les autres types (gramme, litre etc..). Or si je me souviens bien des erreurs que j'ai pu avoir, il était impossible de passer par référence un objet de type Quantité car il fallait qu'il soit instancié.

    Je me trompe ?
    Si gramme, litre, ... sont des class enfants de quantités,oui tu doit faire ca. Peut etre dans boost il y as des choses plus propre.
    Par contre ca m'étonnerai que map soit ce qu'il te faut

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Es ce qu'un enum ne serait pas mieux pour les quantité??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    enum Quantite
    {
    litre,
    gramme,
    ...
    }

  8. #8
    Membre confirmé
    Profil pro
    Developpeur
    Inscrit en
    Septembre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Septembre 2004
    Messages : 114
    Par défaut
    Je vais t'avouer que le schéma UML des classes est déjà donné et donc l'implémentation est déjà choisie Ce doit être des classes dérivées.

    Un vector de Pair m'a l'air pas trop mal en fait mais j'aurais bien aimé avoir la solution pour l'iterator

    Merci encore de ton aide

  9. #9
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Ne voulais-tu pas plutôt utiliser une multimap avec comme clef une Quantite* ?

    Pouvoir récupérer tous les ingrédients dont la quantité est égale à...

    Pour que ta multimap fonctionne avec un pointeur comme clef, il faudra modifier son prédicat de comparaison (plein d'exemples donnés en ce moment sur le forum avec std::sort, std::set etc.)

  10. #10
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Citation Envoyé par allserv Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	if( !_m.empty() ) {
        	quantite_ingredient_map::iterator itt;
             for (itt = _m.begin(); itt != _m.end(); itt++) {
        		((*itt).first).afficherDec(os,1);
        	}
        }
    La méthode qui appelle ce code serait-elle déclarée const ?
    Dans ce cas là utilise plutôt un const_iterator.

    Au passage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((*itt).first)->afficherDec(os,1);
    et :

  11. #11
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    Ne voulais-tu pas plutôt utiliser une multimap avec comme clef une Quantite* ?

    Pouvoir récupérer tous les ingrédients dont la quantité est égale à...

    Pour que ta multimap fonctionne avec un pointeur comme clef, il faudra modifier son prédicat de comparaison (plein d'exemples donnés en ce moment sur le forum avec std::sort, std::set etc.)
    A la limite une multimap pourquoi pas c'est vrai. Mais si le trie ne lui sert a rien...faut mieux un vector.

    D'ailleurs il faudrait qu'il regarde:
    http://cpp.developpez.com/faq/cpp/?p...hoix_conteneur

  12. #12
    Membre confirmé
    Profil pro
    Developpeur
    Inscrit en
    Septembre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Septembre 2004
    Messages : 114
    Par défaut
    L'iterator const ainsi que l'accès aux fonctions via la -> a résolu le problème, cela fonctionne.

    Merci encore pour votre patience

    Louis

  13. #13
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Si il n'est pas nécessaire de répondre à cette question :
    Pouvoir récupérer tous les ingrédients dont la quantité est égale à...
    autant avoir recours à un vector c'est sur.
    Citation Envoyé par Mongaulois Voir le message
    sinon,
    (*itt).first est un pointeur donc :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    quantite_ingredient_map::iterator itt;
    for (itt = _m.begin(); itt != _m.end(); itt++) 
        		(*itt).first->afficherDec(os,1);
    J'avais pas vu cette partie de ton post

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

Discussions similaires

  1. Petit prob de passage par pointeur
    Par leCcsympas dans le forum C
    Réponses: 6
    Dernier message: 06/12/2006, 09h36
  2. Réponses: 4
    Dernier message: 15/10/2006, 18h05
  3. [debutant] prob de comprehension sur pointeur **
    Par iznogoud36 dans le forum C
    Réponses: 10
    Dernier message: 14/09/2006, 13h13
  4. Vider une std::map de pointeur
    Par Zenol dans le forum SL & STL
    Réponses: 14
    Dernier message: 10/02/2006, 13h16
  5. prob. balise MAP!
    Par goodvibs dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 22/06/2005, 22h19

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