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 :

set contenant des objets non constants


Sujet :

SL & STL C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 15
    Points : 16
    Points
    16
    Par défaut set contenant des objets non constants
    Bonjour,

    J'ai besoin de stocker des objets uniques, donc j'utilise des set, mais il semble que l'opérateur insert rend les objets du set const, et moi j'ai besoin de les stocker, mais ensuite de modifier certains de leurs attributs.

    Est-ce qu'il y a moyen d'insérer des objets non constants dans un set ? Sinon, est-ce que quelqu'un pourrait me conseiller une façon de stocker mes objets en pouvant les modifier ?

    Si jamais voilà un ptit code pour illuster mon problème :
    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
     
       1.
          #include <iostream>
       2.
          #include <set>
       3.
     
       4.
          using namespace std;
       5.
     
       6.
          class Constraint{
       7.
     
       8.
            public:
       9.
            int id;
      10.
            set< int > detectors;
      11.
     
      12.
            Constraint(int a){
      13.
              this->id = a; 
      14.
            };
      15.
            void insertDetector(int det){
      16.
              this->detectors.insert(det);
      17.
              return; 
      18.
            };
      19.
     
      20.
     
      21.
          };
      22.
     
      23.
          int main(){
      24.
     
      25.
            set< Constraint > mon_ensemble;
      26.
            for (int a(1); a<3; a++){
      27.
              Constraint contrainte(a);
      28.
              contrainte.insertDetector(2);
      29.
              mon_ensemble.insert(contrainte); 
      30.
            }
      31.
            for(set< Constraint >::iterator it(mon_ensemble.begin()); it != mon_ensemble.end(); it++){
      32.
              (*it).insertDetector(1); 
      33.
            }
      34.
              return 0;
      35.
          }
    A la ligne 32 le compilateur dit que c'est pas possible de modifier l'objet parce qu'il est const.

    Merci beaucoup !

  2. #2
    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

    Redéfinis l'opérateur < dans ta classe Constraint.
    Quelque chose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      bool operator < (const Constraint &other) const
      {
        return id<other.id;
      };
    Enfin à toi de voir sur quoi tu veux trier ton ensemble

    Je pense que l'erreur vient de là.

    Hope it helps

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 15
    Points : 16
    Points
    16
    Par défaut
    Ok, merci pour ça, c'est vrai que ça résout une des erreur que donne mon petit code, mais j'avais juste oublié de l'inclure. En fait, mon problème est avec l'autre erreur. Si je rajoute la déf de l'opérateur <, j'obtiens quand même le message d'erreur suivant :

    main.cc: In function 'int main()':
    main.cc:37: error: passing 'const Constraint' as 'this' argument of 'void Constraint::insertDetector(int)' discards qualifiers

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    C'est assez clair, l'ensemble set ne te donne pas la possibilité de modifier ses éléments. Les méthodes begin() et end () sont déclarées const.
    http://www.sgi.com/tech/stl/set.html
    Tu récupères donc des objets constants.

    Par contre, si tu regardes l'ensemble map, il y a une version const et une non-const des méthodes begin() et end().
    http://www.sgi.com/tech/stl/Map.html

    Si tu veux utiliser un set et pouvoir modifier les objets du set, passe par des pointeurs. Ton pointeur sera constant mais rien ne t'empêchera de modifier l'objet sur lequel il pointe.
    Ou alors récupère l'élément, modifie le, supprime celui dans le set et réinsère ton nouvel élément dans le set mais bon...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 15
    Points : 16
    Points
    16
    Par défaut
    Ok maintenant je m'en sors !

    Merci beaucoup pour ces conseils !

  6. #6
    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 aoyou Voir le message
    Par contre, si tu regardes l'ensemble map, il y a une version const et une non-const des méthodes begin() et end().
    Même dans la version non const, on ne peut pas modifier la clef, seulement la valeur associée. Le problème de base est qu'une modification est susceptible de changer l'ordre, ce qui a laissé 3 possibilités aux inventeurs de set/map :
    - Vérifier l'ordre après chaque changement (mais comment détecter un changement...)
    - Documenter que les modifications sont autorisées uniquement si elles ne changent pas l'ordre, et faire confiance aux utilisateurs pour ne pas se tromper...
    - Empêcher les modifications d'un objet dans un set/map.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Oui, c'est vrai que je ne pensais qu'à la valeur.
    Changer la clé d'un élément, c'est supprimer l'élément et ajouter un nouvel élément effectivement.

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

Discussions similaires

  1. Duplication de record contenant des objets
    Par bleuerouge dans le forum Débuter
    Réponses: 1
    Dernier message: 03/06/2008, 18h45
  2. Réponses: 3
    Dernier message: 08/02/2008, 19h34
  3. Réponses: 2
    Dernier message: 04/07/2007, 10h17
  4. Réponses: 1
    Dernier message: 23/06/2006, 10h10
  5. Réponses: 2
    Dernier message: 07/11/2005, 18h54

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