Zeiger und Vektoren
-
Das Klassenobjekt (und damit das enthaltene Array) existieren doch weiterhin.
Man darf nur nicht eine Referenz auf eine lokale Variable zurückgeben.
-
Ahh okay..stimmt. Danke!
-
@C-Sepp sagte in Zeiger und Vektoren:
int& IntArr::operator[](int i) { if (i <= 0 || i > len) cerr << "Der Bereichsindex wurde überschritten"; return ptrArr[i]; }
Aua, das tut weh. Wenn man schon auf den Index prüft, dann bitte auch richtig darauf reagieren. Bei Dir gibt es trotzdem einen Zugriff auf das falsche Element.
int& IntArr::operator[] (const int i) { if (i <= 0 || i > len) throw std::runtime_error("index out of bounds"); return ptrArr[i]; }
Wenn man unbedingt die Resourcen selbst verwalten will muss man die Rule of five einhalten.
P.S. int ist kein guter Datentyp für die Länge von Arrays.
-
@john-0 sagte in Zeiger und Vektoren:
Aua, das tut weh. Wenn man schon auf den Index prüft, dann bitte auch richtig darauf reagieren. Bei Dir gibt es trotzdem einen Zugriff auf das falsche Element.
int& IntArr::operator[] (const int i) {
if (i <= 0 || i > len) throw std::runtime_error("index out of bounds");Ist ja schön und gut, dass du das cerr in die Exception umgewandelt hast, aber das hüpfende Komma war doch die if-Bedingung
if (i <= 0 || i > len)
, die vielleicht besserif (i < 0 || i >= len)
hätte heißen sollen, sofern man nicht einensize_t
nimmt. Wobei ich mir angewöhnt habe, Längen von Containern grundsätzlich übertest < container.size()
zu vergleichen, d.h. immer "irgendwas kleiner als size" zu schreiben. Dann muss man nicht mehr nachdenken, ob<
,<=
oder welcher Operator auch immer richtig ist....wenn man diese Klasse behalten will, sollte man zusätzlich zu den schon genannten Dingen auch noch einen const-overload für diesen Operator anbieten - oder sich allgemein überhaupt mal um const-correctness Gedanken machen.