Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Rückgabe von Iteratoren

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
01.06.2005, 16:07 Uhr
~Daywalker
Gast


Hallo zusammen,
habe eine Problem mit der Rückgabe von Iteratoren an mein Programm. Ich verwende ein list - Template der STL, welches ich mit Objekten einer selbstdefinierten Klasse ClFest fülle. Die Liste selber wird in der Klasse ClKalender aufgebaut. Die Methoden, über welche ich die Elemente der Liste manipuliere, gehören zur Klasse ClKalender. Hier erst mal was Quelltext:


C++:

list<ClFest> kalender;
list<ClFest>::iterator pos;


=> Deklaration in main()


C++:
kalender.push_back(ClFest (datei));


=> füllen der Liste durch eine Methode der Klasse ClKalender, funktioniert soweit, kann also innerhalb von ClKalender auf dei ELemente zugreifen und ihre Attribute ausgeben bzw. verändern
=> nun möchte ich aber in der KLasse ClFest diese Liste durchlaufen und an die aufrufende Methode von ClKalender das Ergebnis des Suchlaufs als Pointer auf ein Objekt des Typs ClFest zurückgeben

C++:
pos = kalender.begin(); //Zuweisung Iterator
(*pos).festalsname(bezeichnung,kalender); // eigentlicher Funktionsaufruf


=> hier übergeben ich der Methode der Klasse ClFest meine Liste kalender, damit diese durchsucht werden kann


C++:
ClFest *ClFest::festalsname(
char                       *bezeichnung, list<ClFest> kalender)
{
list<ClFest>::iterator pos;
pos = kalender.begin();
//hier wird die Liste nach einem Element durchsucht
return pos;
//wie der Funktionskopf zeitg, soll als Rückgabewert ein Pointer auf ein Element der Liste kalender (typ ClFest) zurückgegeben werden.


=> meine bisherigen Versuche führten dazu, dass entweder bereits der Compiler motzte, falls nicht aber zumindest das Programm abstürzte, sobald diese Stelle erreicht wurde
P.S. ich benutze keinerlei Vererbungshierarchie, da ich das Programm nachträglich von einer "normalen" Liste auf eine Template - Liste der list - bibliothek umstelle

Danke schon mal, ich weiß nicht mehr weiter!
Patrick
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.06.2005, 08:49 Uhr
doppler



In diesem Fall sind einige Fehlerquellen denkbar. Beispielsweise könnte es sein, dass du aus Versehen auf Elemente der Liste zugreifst, die es nicht gibt oder Ähnliches.

Was mir an dem Code auffällt, ist dass pos ein List-Iterator ist, du aber einen Pointer vom Typ C1Fest zurückgeben möchtest. Diese Typen sind nicht notwendigerweise gleich (hängt von der Implementierung ab). Vielleicht funktioniert ja return &*pos; oder du gibst gleich einen iterator zurück.

Ansonsten kannst du ja mal etwas mehr zu
//hier wird die Liste nach einem Element durchsucht
schreiben.

Dieser Post wurde am 02.06.2005 um 08:49 Uhr von doppler editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
02.06.2005, 10:32 Uhr
doppler



Noch etwas:
Du deklarierst

C++:
ClFest *ClFest::festalsname(char* bezeichnung, list<ClFest> kalender)



Wenn die Funktion aufgerufen wird, heißt das, dass kalender zuerst kopiert wird, die lokale Kopie weiterverarbeitet wird und am Schluss wieder zerstört wird. Mit return pos gibst du also einen iterator auf das lokale Objekt, das nach Verlassen der Funktion zerstört ist zurück.

Versuch es mal mit

C++:
ClFest *ClFest::festalsname(char* bezeichnung,const list<ClFest>& kalender)


oder, wenn kalender geändert wird und du einen iterator und keinen Zeiger zurückgeben willst

C++:
typename list<ClFest>::iterator ClFest::festalsname(char* bezeichnung, list<ClFest>& kalender)


oder einer der beiden anderen Kombinationen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
02.06.2005, 14:51 Uhr
~Daywalker
Gast


Danke Doppler für die Vorschläge. Seh jetzt wo mein Problem lag. Ein zeiger auf ein zerstörtes Objekt ist ziemlich ineffizient. Hab aber jetzt meine ganze Programmstruktur umgestellt und spar mir dadurch die Rückgabe des Iterators. Aber wenigstens weiss ich jetzt die Syntax für einen solchen Fall!
Patrick
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: