STL-vector []-operator
-
Hi Leute,
folgendes Prob.:
Ich versuche mich gerad an einem Kartenspiel und verwende fuer nen Stapel Karten vector<Karte> aus STL. Meine Frage:
Ich brauche ne methode die mir die n'te Karte aus nem Stapel zurueckliefert. Der []-operator von vector liefert laut Dokumentation ne referenz zurueck, aber was liefert dieser wenn der stapel leer ist?? Funzt das folgende ueberhaupt ...Karte& Stapel::schmeiss_karte(unsigned n) { return karten_stapel[n]; }
Mein Compiler gibt ne Fehlermeldung zurueck wenn ich in obigem vorher ueberpruefe ob der kartenstapel leer ist und entsprechend NULL zurueckliefern will (da passt ihm wohl der typ der methode mit NULL nicht!?)
Fuer ideen waere ich dankbar.
gruss.
-
Wenn du auf ein Element ausserhalb des Vektors zugreifst ist das Verhalten undefiniert. Du kannst entweder die Methode at() verwenden oder sicherstellen, dass du nie auf ein Element >= size() zugreifst.
-
Ergänzung:
Du lieferst eine Referent zurück. Und Referenzen dürfen nicht NULL sein. Deswegen läßt Dir Deine Compiler das return NULL nicht durch.
MfG Jester
-
ok, das hat schon etwas geholfen aber trotzdem nicht ganz:
was muss ich denn nun zurueckliefern wenn das ding leer ist ????
es muss doch fuer obige deklaration und den fall dass der vektor leer ist eine unterscheidungsmoeglichkeit geben ?vorab danke nochmals.
gruss
-
Wieso reitest du so auf dem Spezialfall, dass der Stapel leer ist, herum? Was ist, wenn du die 10te Karte aus einem 5-Karten-Stapel anforderst?
Mach dir mal Gedanken über das Design.
-
ok, das war auch nicht sehr hilfreich
dass das ein spezialfall ist weiss ich auch, nur mir faellt im moment leider nix ein wie man sowas sauber angehen kann.
bei allem respekt: mit nem tipp oder nem ideen-ansatz von bashar wie man das umsetzen kann haette ich mehr anfangen koennen als mit ner bemerkung ich muesste mir mal gedanken ueber den design machen. Das ist doch gerade mein Problem und ich hatte gehofft hier mehr dazu zu finden
Also bitte, fuern ne kleine Idee gibt es dann auch ein dickes lob
gruss
-
3 Möglichkeiten:
- du returnest Karte* statt Karte&
somit kannst du 0 returnen bei einem Fehler
das ist die gängige strukturierte Methode
-
du wirfst ne Exception, zb auto_of_range - siehe Bashars Beitrag
-
du schreibst nur ein assert hin und sagst: eine karte die es nicht gibt anzufordern ist ein Logikfehler und kein Laufzeitfehler
- du returnest Karte* statt Karte&
-
2 Vorschläge:
1. Mach die Funktion so:
bool Stapel::schmeiss_karte(Karte& karte, int n)
...
und prüf halt vor der Zuweisung mit size() ab2. Mach dein Array aus Pointern auf Karten und gibt
Karte* zurück. Würd ich aber von abraten.Jockel
-
danke danke. bin nun weiter.
(und hier mein lob an shade_of_mine und jockel ... und bashar
)
gruss.