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 :

[multiset]comment déclarer un multiset contenant un des instances d'une classe ?


Sujet :

SL & STL C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 31
    Points : 25
    Points
    25
    Par défaut [multiset]comment déclarer un multiset contenant un des instances d'une classe ?
    Bonsoir,
    Bon, je vais essayer d'être le plus clair possible, voici mon problème :
    J'ai une classe Stock qui hérite du la classe multiset :

    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
     
    #include "rouleau.h"
     
    #include <multiset>
    #include <algorithm>
     
    using namespace std;
     
    typedef multiset <?, ?> stockRouleaux;
     
    class Stock : public stockRouleaux
    {
    	public:
     
    		Stock();
     
    		~Stock();
    };
    Ce multiset est sensé contenir des instances de ma classe Rouleau :

    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
     
    #include <string>
     
    using namespace std;
     
    class Rouleau
    {
        protected:
     
            string reference;
            short diametre;
            short rangee;
            short colonne;  
     
    	public:
     
    		Rouleau(string ref, short diam, short rang, short col);
    };
    Je souhaite donc que ce multiset contienne des instances de Rouleau, triés par ordre croissant de l'attribut diametre de chacune de ces instances.
    Suis-assez clair?!

    DONC, tout ce que j'aimerai savoir, c'est comment déclarer un tel multiset (j'ai cherché et je n'est eu que des exemples de multisets contenant des entiers...)

    Merci d'avance!

  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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Tout d'abord, créer un comparateur permettant de comparer deux rouleaux entre eux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class ComparateurDeRouleau
    {
      bool operator()(Rouleau const &r1, Rouleau const &r2)
      {
        return r1.diametre < r2.diametre;
      }
    };
    Ensuite, le multiset :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef multiset<Rouleau, ComaprateurDeRouleau> stockRouleaux;
    Par contre, ton truc de dériver de multiset est en général une mauvaise idée.
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 31
    Points : 25
    Points
    25
    Par défaut
    Euh...
    Bah le truc c'est que l'héritage a été imposé dans le TP que j'ai a rendre...
    Je croyais qu'il était possible de classer les objets contenus en déclarant le multiset comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    multiset <?, less<?> > monMultiset;
    ce qui permettrai de classer automatiquement mes insertions sans avoir a utiliser une méthode intermédiaire...
    Du moins c'est ce que j'ai vu dans les exemples avec des int.

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par joejoe230 Voir le message
    Euh...
    Bah le truc c'est que l'héritage a été imposé dans le TP que j'ai a rendre...
    Je croyais qu'il était possible de classer les objets contenus en déclarant le multiset comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    multiset <?, less<?> > monMultiset;
    ce qui permettrai de classer automatiquement mes insertions sans avoir a utiliser une méthode intermédiaire...
    Du moins c'est ce que j'ai vu dans les exemples avec des int.
    Dans ce cas la faut definir "operator <"

  5. #5
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Points : 833
    Points
    833
    Par défaut
    Dans les deux cas : utilisation du foncteur ComparateurDeRouleau ou surcharge de l'opérateur < ton multiset sera trié à l'insertion (mais pas à la mise à jour).

    C'est curieux qu'ils t'imposent d'hériter de multiset. On a souvent tendance à faire trop d'héritage intuitivement alors qu' il est souvent préférable d'utiliser la composition à l'héritage (si possible bien entendu). Ne peux tu pas simplement déclarer un membre stockRouleaux en utilisant le typedef de JolyLoic ?
    Linux > *

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    Citation Envoyé par joejoe230 Voir le message
    Euh...
    Bah le truc c'est que l'héritage a été imposé dans le TP que j'ai a rendre....
    bah tu diras à ton prof que les objets de la Standard Library ne sont généralement pas fait pour être hérité et qu'ils n'ont pas de destructeurs virtuels d'ailleurs.

  7. #7
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par joejoe230 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    multiset <?, less<?> > monMultiset;
    ce qui permettrai de classer automatiquement mes insertions sans avoir a utiliser une méthode intermédiaire...
    Du moins c'est ce que j'ai vu dans les exemples avec des int.
    Là, ça utilise une fonction intermédiaire, less, qui elle même utilise une fonction intermédiaire (operator<). Il est possible dans certains cas (je ne suis pas certain que ce soit le cas ici, je ne sais plus si on peut accéder directement aux données membre) d'écrire cette fonction sur place, avec des binders divers et variés, mais ça devient vite illisible à mon goût.

    Sur le choix entre uns fonction spécifique par rapport à l'opérateur<, je préfère ici la fonction spécifique, car le tri par diamètre n'a rien de fondamental pour moi, et un autre conteneur pourrait vouloir être trié par longueur, poids, prix... par exemple. Et autant on peut avoir autant de foncions spécifiques qu'on veut, autant on ne peut avoir qu'un seul opérateur<
    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.

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Là, ça utilise une fonction intermédiaire, less, qui elle même utilise une fonction intermédiaire (operator<). Il est possible dans certains cas (je ne suis pas certain que ce soit le cas ici, je ne sais plus si on peut accéder directement aux données membre) d'écrire cette fonction sur place, avec des binders divers et variés, mais ça devient vite illisible à mon goût.

    Sur le choix entre uns fonction spécifique par rapport à l'opérateur<, je préfère ici la fonction spécifique, car le tri par diamètre n'a rien de fondamental pour moi, et un autre conteneur pourrait vouloir être trié par longueur, poids, prix... par exemple. Et autant on peut avoir autant de foncions spécifiques qu'on veut, autant on ne peut avoir qu'un seul opérateur<
    +1

  9. #9
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Points : 833
    Points
    833
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Sur le choix entre uns fonction spécifique par rapport à l'opérateur<, je préfère ici la fonction spécifique...
    Bien dit

    J'ai même parfois croisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     bool operator<(const Objet &other)
      {
        return length > other.length;
      }
    Pour forcer le tri dans l'ordre décroissant à l'insertion. Aberrant.
    Linux > *

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 31
    Points : 25
    Points
    25
    Par défaut
    Merci beaucoup d'avoir répondu!

    Je vois bien ou vous voulez en venir en ce qui concerne l'héritage, j'ai juste traduit le diagramme UML que m'a fourni mon prof...
    Mais je suis d'accord qu'il serait bien plus adéquat d'utiliser une composition.
    Il s'agira juste de déclarer mon multiset en attribut de ma classe Sotck.

    Donc, si je reprends cette déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef multiset<Rouleau, ComaprateurDeRouleau> stockRouleaux;
    avec ce foncteur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class ComparateurDeRouleau
    {
      bool operator()(Rouleau const &r1, Rouleau const &r2)
      {
        return r1.diametre < r2.diametre;
      }
    };
    Mes instances seront triées par ordre croissant de leurs attribut diametre ?

    Merci de votre en tout cas, c'est tout de suite plus comprehensible!

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

Discussions similaires

  1. [WD17] Poo : Liste des instances d'une classe
    Par R&B dans le forum WinDev
    Réponses: 2
    Dernier message: 29/03/2012, 16h22
  2. Liste des instances d'une classe
    Par alexdevl dans le forum Général Python
    Réponses: 32
    Dernier message: 14/09/2011, 23h52
  3. Nommer des instances d'une classe dynamiquement ?
    Par Demosis dans le forum Langage
    Réponses: 4
    Dernier message: 04/11/2007, 15h22
  4. Réponses: 8
    Dernier message: 04/04/2006, 18h29
  5. Réponses: 14
    Dernier message: 15/01/2004, 02h15

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