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

SL & STL C++ Discussion :

Problème de multimap avec des classes dérivées


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 3
    Par défaut Problème de multimap avec des classes dérivées
    Bonjour,

    J'ai une classe mère "Produit" avec des classes filles comme "Ordinateur". Et j'utilise la STL multimap pour créer ma liste de produit.

    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
    84
    85
    class Produit 
    {
       public:
              Produit();//Constructeur
              Produit(std::string tmp_marque, std::string tmp_nom, std::string tmp_type, double tmp_prix);
    	  Produit(const Produit &exemple);//Constructeur par recopie
    	  ~Produit(); //Destructeur
     
    	  //Mutateurs
    	  void SetMarque(std::string tmp_marque);
    	  void SetNom(std::string tmp_nom);       
    	  void SetCode(std::string tmp_code);     
    	  void SetType(std::string tmp_categorie); 
    	  void SetPrix(double tmp_prix);         
     
    	  //Accesseurs
    	  std::string GetMarque(); 
    	  std::string GetNom();    
    	  std::string GetCode();   
    	  std::string GetType();   
    	  double GetPrix();        
     
    	  virtual void afficher_fiche_produit()
    	  {
    	      std::cout << "Code barre: " << GetCode() << std::endl;
    	      std::cout << "Marque: " << GetMarque() << std::endl;
    	      std::cout << "Nom: " << GetNom() << std::endl;
    	      std::cout << "Prix: " << GetPrix() << std::endl;
    	 }
     
       protected:
          std::string marque;  //Marque du produit 
          std::string nom;     //Nom du produit
          std::string code_barre;//Code barre du produit
          std::string type; //Type de produit 
          double prix; //Prix du produit
    };
     
    class Ordinateur: public Produit 
    {
       public:
     
    	  //Constructeur et destructeur
    	  Ordinateur();
    	  Ordinateur(std::string tmp_marque, std::string tmp_nom, std::string tmp_type, std:: string tmp_cate, double tmp_prix);
    	 Ordinateur(const Ordinateur &exemple);
    	  ~Ordinateur();
     
    	  //Mutateur et Accesseur
              void SetCategorie(std::string tmp_cate);
    	  std::string GetCategorie();
     
    	  void afficher_fiche_produit()
              {
    	      Produit::afficher_fiche_produit();
                  cout << "Type: Ordinateur" << endl;
    	      cout << "Categorie: " << this->categorie << endl;
              }
     
       protected:
    	  std::string categorie;
    }
     
    typedef std::multimap<std::string, class Produit> Liste_produit;
     
    class Stock
    {
        public:
    	    Stock(void);
    	    ~Stock(void);
    	    void ajouter_produit_liste(std::string marque, std::string nom, Produit exemple);
     
    	    void afficher_data_produit()
                {
                for(multimap<string, Produit>::iterator it = liste_produit_magasin.begin(); it != liste_produit_magasin.end(); ++it)
    	{
    		if(it->second.GetType() == "P")
    		{  
    		    it->second->afficher_fiche_produit();
    		}
    	}
     
        private:
    		Liste_produit liste_produit_magasin;
    };
    Le problème c'est qu'il ne veut pas utiliser la fonction "afficher_fiche_produit()" de la classe Ordinateur (car je veux afficher des spécificités). Comment faire pour que je puisse faire une multimap de différents produits? Merci de votre aide

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Dans ta map, tu stocke des produits. Un produit est un produit, et rien d'autre. Donc si tu mets un Ordinateur dans ton conteneur, il va être casté dans sa classe de base, pour n'être plus qu'un produit, et oublier ce qui le rendait spécifique. On appelle ça le slicing, car l'objet se trouve découpé pour ne conserver que la classe de base.

    Comment résoudre ça ? Faire une map non plus de Produits, mais de pointeurs de Produits. Car un pointeur sur un Produit peut pointer sur un Ordinateur. En C++, le polymorphisme passe toujours par des pointeurs ou des références.

    Après viendra alors la question de la gestion de la durée de vie des objets pointés.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 3
    Par défaut
    D'accord... Et pour faire un conteneur de pointeur de Produit, ca serait "multimap<string, Produit*>" ? Mais je ne vois pas trop comment faire pour que ce nouveau conteneur affiche les infos de ma classes fille ?

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 3
    Par défaut
    C'est bon j'ai réussi , Merci

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/10/2012, 10h28
  2. Problème avec des classes qui etendent la classe View
    Par amsagitos dans le forum Composants graphiques
    Réponses: 0
    Dernier message: 14/09/2011, 22h14
  3. Problème avec des Class en asp
    Par titou250 dans le forum ASP
    Réponses: 3
    Dernier message: 06/06/2006, 13h22
  4. Réponses: 9
    Dernier message: 25/09/2005, 16h33
  5. Réponses: 6
    Dernier message: 19/10/2004, 13h46

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