List: Wie funktioniert das?
-
Hallo Forum,
wie funktionieren in C++ die Listen? Ich habe mir was aus dem Internet zusammengestoppelt:
class MyClass { public: // DataClassObj ist eine einfache Klasse mit ein paar Gettern und Settern und ein paar privaten strings. std::list<DataClassObj> m_lstDataSets; int AddData(const DataClassObj &oData) { m_lstDataSets.push_back(oData); return 0; } // Diese Methode soll das Element an der Stelle index rauswerfen. Genauer gesagt ein Kopie. // Wenn es einfacher geht bin ich dankbar, VS6 bietet keine Hilfe zu den Methoden der Liste an. // Trotzdem bin ich interessiert wie ich von iter zum Listenobjekt komme. Laut Beispiel sollte es so gehen. DataClassObj GetData(int index) const { int counter=0; for (list<DataClassObj>::const_iterator iter=m_lstDataSets.begin(); iter!=m_lstDataSets.end(); ++iter) { counter++; if (counter == index) { return iter; // Hier der Kompilerfehler. } } //return 0; Was gebe ich zurück wenn kein Element gefunden wurde? Dieses gibt noch mehr Fehler. } }Das Problem ist "return iter":
error C2664: '__thiscall DataClassObj::DataClassObj(const class DataClassObj &)' : cannot convert parameter 1 from 'class std::list<class DataClassObj,class std::allocator<class DataClassObj> >::const_iterator' to 'const class DataClassObj &'
Reason: cannot convert from 'class std::list<class DataClassObj,class std::allocator<class DataClassObj> >::const_iterator' to 'const class DataClassObj'
No constructor could take the source type, or constructor overload resolution was ambiguous
-
iter ist ein sog. Iterator - ein Zeiger-ähnliches Gebilde, das speziell auf die interne Struktur des Containers (in deinem Fall list<> - eine doppelt verkettete Liste) ausgerichtet ist. Wenn du den Wert, auf den er "zeigt", zurückgeben willst, mußt du ihn dereferenzieren: 'return *iter;'.
PS: Wenn du häufiger über den Index an ein Listenelement kommen mußt, wären vermutlich vector<> oder deque<> die bessere Wahl.
-
Vielen Dank CStoll

Was gebe ich zurück wenn nichts gefunden wurde? Das zweite return ist ja auskommentiert. Was passiert da? Es wird ein Rückgabe erwartet aber nichts zurückgegeben...
In diesem Beispiel bleibt mir wohl nichts übrig als ein leeres DataClassObj zu erstellen und dieses dann zurückzugeben... oder ich gebe einen Pointer zurück.
-
Das mußt du entscheiden - wie oft kommt es denn vor, daß jemand einen nicht vorhandenen list-Eintrag haben möchte? (du könntest einen dummy-Wert zurückgeben - aber eventuell ist es günstiger, eine Expetion zu werfen).
PS: Etwas kompakter als deine Funktion:
DataClassObj GetData(int index) const { if(index>=m_lstDataSets.size() throw(out_of_range);//oder andere Fehlerbehandlung list<DataClassObj>::const_iterator iter = m_lstDataSets.begin(); advance(iter,index); return *iter; }
-
Vielen Dank
