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 besser if (i < 0 || i >= len) hätte heißen sollen, sofern man nicht einen size_t nimmt. Wobei ich mir angewöhnt habe, Längen von Containern grundsätzlich über test < 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.


Anmelden zum Antworten