Map mit eigener Klasse
-
Hi,
Ich bin neu hier und auch neu bei C++ und desshalb stelle ich hier eine warscheinlich extrem triviale Frage.Der folgende Code Funktioniert bei mir nicht. Ich habe keine Ahnung warum.
#include <iostream> #include <map> #include <string> typedef std::string pbstr; class list{ int Test; }; int main(){ std::cout << "Test \n"; std::map<pbstr,list> lists; //std::pair<int,bool> test //test.second=true if(lists.insert(std::pair<pbstr,list>("fun", 0)).second){ std::cout << "Yeah \n"; } std::cin; system("PAUSE"); return EXIT_SUCCESS; }Ich hoffe mir kann jemand helfen, damit ich schnell mehr C++ lernen kann

-
folgender code functioniert nicht, ist keine ausreichende fehlerbeschreibung. Fehlermeldungen des compilers? Stürzt er ab? was geht denn nicht?
der fehler liegt sicherlich in der zeile mit dem insert. aus 0 kann kein list-objekt erstellt werden. Außerdem muss das .second weg, da ja das gesamte pair eingefügt werden muss.
-
Nunja ich verstehe leider den Fehleroutput nicht. Ich dachte, da es sich hier um ein warscheinlich sehr einfach problem handelt solte dass nichts ausmachen.
Statt 0 kann man vielleicht auch dass schreiben#include <iostream> #include <map> #include <string> typedef std::string pbstr; class list{ int Test; }; int main(){ std::cout << "Test \n"; std::map<pbstr,list> lists; //std::pair<int,bool> test //test.second=true if(lists.insert(std::pair<pbstr,list>("fun", new list)).second){ std::cout << "Yeah \n"; } std::cin; system("PAUSE"); return EXIT_SUCCESS; }ich weiß es aber nicht. Sry
-
Selbst wenn du den Output nicht verstehst, versteht ihn hier sicher der ein oder anderer und kann dir so helfen.
So wird dir kaum einer helfen.
-
Kann mir kaum vorstellen, dass des jemanden hilft aber du hast mehr erfahrung also:
Compiler: Default compiler
Führt g++.exe... aus
g++.exe "D:\Programmieren\KoMaNi IM\Core 1.4\Plugins\Base\Error\ErrorExample.cpp" -o "D:\Programmieren\KoMaNi IM\Core 1.4\Plugins\Base\Error\ErrorExample.exe" -I"C:\Programme\Dev-Cpp\lib\gcc\mingw32\3.4.2\include" -I"C:\Programme\Dev-Cpp\include\c++\3.4.2\backward" -I"C:\Programme\Dev-Cpp\include\c++\3.4.2\mingw32" -I"C:\Programme\Dev-Cpp\include\c++\3.4.2" -I"C:\Programme\Dev-Cpp\include" -L"C:\Programme\Dev-Cpp\lib"
D:\Programmieren\KoMaNi IM\Core 1.4\Plugins\Base\Error\ErrorExample.cpp: In functionint main()': D:\\Programmieren\\KoMaNi IM\\Core 1.4\\Plugins\\Base\\Error\\ErrorExample.cpp:21: error: no matching function for call tostd::pair<pbstr, list>::pair(const char[4], int)'
C:/Programme/Dev-Cpp/include/c++/3.4.2/bits/stl_pair.h:69: note: candidates are: std::pair<pbstr, list>::pair(const std::pair<pbstr, list>&)
C:/Programme/Dev-Cpp/include/c++/3.4.2/bits/stl_pair.h:85: note: std::pair<_T1, _T2>::pair(const _T1&, const _T2&) [with _T1 = pbstr, _T2 = list]
C:/Programme/Dev-Cpp/include/c++/3.4.2/bits/stl_pair.h:81: note: std::pair<_T1, _T2>::pair() [with _T1 = pbstr, _T2 = list]Ausführung beendet
-
Kommst du von Java?

new listliefert dir einen Zeiger auf list, also ein list*. Du könntest mit *(new list) an das dazugehörige Objekt kommen, aber davon rate ich ab, weil du dann ein Speicherleck hast. Beim Einfügen wird das list-Objekt nämlich kopiert, und auf das ursprüngliche Objekt gibt es dann keinen Zeiger mehr, d.h. du kannst es gar nicht mehr freigeben.
Mach's so:
if(lists.insert(std::pair<pbstr,list>("fun", list())).second){
-
if(lists.insert(std::pair<pbstr,list>("fun", list())))In die Map kommt aber trotzdem das ganze Paar

-
LordJaxom schrieb:
In die Map kommt aber trotzdem das ganze Paar

Ich glaube, du hast dich bei den Klammern verzählt. Das second im Code bezieht sich nicht auf das Pair, das eingefügt wird, sondern auf das Pair, das insert zurückgibt. Dessen second gibt wieder, ob es schon einen Eintrag mit diesem Schlüssel gab.
-
Oh, Du hast Recht. Mea culpa

-
MFK schrieb:
Kommst du von Java?

new listliefert dir einen Zeiger auf list, also ein list*. Du könntest mit *(new list) an das dazugehörige Objekt kommen, aber davon rate ich ab, weil du dann ein Speicherleck hast. Beim Einfügen wird das list-Objekt nämlich kopiert, und auf das ursprüngliche Objekt gibt es dann keinen Zeiger mehr, d.h. du kannst es gar nicht mehr freigeben.
Mach's so:
if(lists.insert(std::pair<pbstr,list>("fun", list())).second){Oh OK ich wusste nicht, dass die Map eine kopie erstellt. Nein ich komme nicht von Java ich komme von was wo man sowas viel Lowleveliger macht.
Nunja zurück zum Thema. Das was du machst Funktioniert. Aber warum.
Wie kann ich den definieren, was der Rückgabewert ist wenn ich Klammern hinter einen Typ schreibe?