[]-Operator überladen?
-
Hallo,
ich habe eine Funktion, die Daten aus einer Datei in eine map einliest.
Jetzt möchte ich den []-Operator überladen, so dass bei jedem Schlüssel überprüft wird, ob er vorhanden ist und falls nicht, eine Fehlermeldung ausgegeben wird.Ich hab das jetzt schon mal versucht, nur leider funktioniert es überhaupt nicht.
Ich weiß jetzt leider auch überhaupt nicht, woran es liegt... Vielleicht könnt Ihr mir da ja weiterhelfen?#include <map> #include <fstream> #include <sstream> using namespace std; class test { public: test(){}; // Constructor ~test(){}; // Destructor template<class T> bool read(map<string, T> &data) { ifstream IN ("test.txt"); if (IN.is_open()) { string line; while (getline(IN, line)) { stringstream sstr; string key; T value; sstr << line; sstr >> key >> value; data[key] = value; } IN.close(); return true; } else { cout<<"ERROR\n"; return false; } } template<class T> T &operator[](const string key) { if (data.find(key) == data.end()) { cerr<<"# Invalid key, please check "<<key<<"!"<<endl; cerr<<"# Program terminated!"<<endl; exit(1); } return data[key]; } };#include "test.h" #include <iostream> using namespace std; int main() { test bsp; map<string,double> dataD; bsp.read(dataD); double abc = dataD["ABC"]; double def = dataD["DEF"]; double ghi = dataD["GHI"]; return 0; }
-
Funktioniert nicht ist keine Aussage.
Lässt es sich kompilieren? Wenn ja, was funktioniert dann genau nicht?
Wenn nein, zeit die Fehlermeldung. Am besten eingeschränkt auf den Ort, wo du den Fehler vermutest.
-
Kompilieren lässt es sich schon.
Meine Datei sieht bspw. so aus:
ABC 1.23 DEF 4.56 GHI 7.89Wenn ich jetzt z.B. nach dem Schlüssel "JKL" suche, dann sollte ja die Fehlermeldung erscheinen und das Programm abbrechen, weil es diesen Schlüssel nicht gibt.
Passiert aber nicht. Es läuft ganz normal weiter und setzt für den Wert mit dem Schlüssel "JKL" einfach 0.
-
Selbst wenn es korrekt übersetzte, wird das Programm nicht wie gewünscht laufen. LadyM, du solltest dich in die Klassen-Thematik prinzipiell ein paar Stunden einlesen und es an "einfacheren" Aufgaben versuchen.
Was du hier versucht hast, ist ein paar Funktionen aus einem Deiner vorherigen Forum-Threads[1] zu nehmen und class { ... }; drum herum zu schreiben. Wenn es funktionierte, dann ist die Klasse 'test' nur ein entarteter Namensraum.
Grüße... Heiko
---
[1]: http://www.c-plusplus.net/forum/viewtopic-var-t-is-205837.html
-
Was du da überladen hast, ist nicht die Klasse map, sondern deine Klasse test.
dataD["ABC"];Ist ja vom Typ std::map<std::string, double> und da ist der [] - Operator nicht überladen. Wenn du nämlich gedubuggt hättest, hättest du das gesehen, dass nicht deine Funktion aufgerufen wird, sondern die vom der STL...