Bonjour,
J'ai un problème avec la surcharge de l'opérateur d'indexation.
J'ai appris en cours les deux exemples de prototypes à utiliser :
Pour les besoins d'un projet où la STL est partiellement interdite (seul les headers iostream, fstream, et string sont autorisés), je cherche à reproduire un conteneur associatif avec des couples key/item (limité aux types string/int).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 int& operator[](int); // écriture int operator[](int) const; // lecture
J'ai créé une classe Dict (par analogie avec le type dict en Python), dont voici le header :
Un arbre binaire est utilisé pour stocker les couples key/item.
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 // ... #include <string> typedef std::string KeyType; typedef int ItemType; class Dict { public: // ... // ajout d'un nouveau couple key/item, // ou nouvelle valeur de l'item si new_key existe déjà ItemType& operator[](KeyType new_key); // recherche d'un item à partir d'une clef // une exception est levée si la clef n'existe pas ItemType operator[](const KeyType& key) const; // ...
Le but recherché est de pouvoir écrire dans le code client :
Le problème est que la dernière ligne de code appelle aussi la méthode d'ajout, et non celle de recherche (comportement confirmé par des cout dans les méthodes).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Dict d; // accès en écriture d["test"] = 7; d["essai"] = 52; d["test"] = 0; // 7 est écrasé // accès en lecture int i = d["essai"]; // i = 52;
Du coup, si la clef existe, une référence vers l'item associé est retournée (au lieu d'être dupliqué).
Et si la clef n'existe pas, la méthode retourne une valeur indéfinie (au lieu de lever une exception).
Que dois-je modifier pour différencier l'appel de la méthode de recherche de la méthode d'ajout ?
Merci.
Partager