Wert am Index X lesen und Setzen mit operator[]?



  • Kleines Zeichen große Wirkung

    inline int& /* <-- referenz zurueckgeben */ operator[](const int &index){ 
                if(index<0 || index >= getOptCount()) 
                    return -1; 
                return m_aiOptions[index]; 
            }
    


  • Technisch reicht ein einzelnes Zeichen aus: "int**&** operator[](int index){...}". Praktisch solltest du für diesen Fall die Fehlerbehandlung anders durchführen (d.h. dir Gedanken darüber machen, wohin die Zuweisung "objekt[-1]=5;" schreiben sollte).

    PS: primitive Datentypen kannst du gerne als Wert übergeben 😉



  • hmm ok müsste aber in der Funktion bei SET nihc sowwas wie

    m_aiOptions[index]=....;
    

    quaise ne zuweisung? ich mach ja sons tnur ein return



  • BorisDieKlinge schrieb:

    hmm ok müsste aber in der Funktion bei SET nihc sowwas wie

    m_aiOptions[index]=....;
    

    quaise ne zuweisung? ich mach ja sons tnur ein return

    Nein. Die Zuweisung findet nicht in der Funktion sondern im aufrufenden Code statt.



  • Ja, du machst nur ein return - allerdings gibst du eine Referenz auf ein Element deiner Klasse zurück. Der aufrufende Code nimmt diese Referenz und kann über sie dem Element etwas zuweisen.



  • int &operator[](size_t index) {
      if(index >= getOptCount())
        throw std::out_of_range();
      return m_aiOptions[index];
    }
    

    1. Bei builtin-Typen lohnt sich eine const-Referenz nicht, da das kopieren genauso schnell ist, der Zugriff aber schneller!
    2. int benutzt man nicht für Längen oder Positionsangaben! Eher unsigned oder richtigerweise size_t!
    3. wirf ne Exception. Woher soll man sonst wissen, das -1 kein gültiger Wert ist?



  • jo habs so gemacht:

    inline int &operator[](UINT &index){
    			if(index<0 || index>= getOptCount())
    				ASSERT(index);
    			return m_aiOptions[index];
    		}
    


  • aber der referenz effekt tritt nur für (SET) die Operatorübrladung in kraft oder?



  • Der "Referenzeffekt" tritt immer auf, wenn der op[] verwendet wird. Ob du ihn nutzt, ist dann deine eigene Angelegenheit.



  • BorisDieKlinge schrieb:

    jo habs so gemacht:

    inline int &operator[](UINT &index){
    			if(index<0 || index>= getOptCount())
    				ASSERT(index);
    			return m_aiOptions[index];
    		}
    

    Ne! UINT als Parameter ist falsch (size_t), dann übergib keine Referenz! Außerdem benutzt man ASSERT anders!


Anmelden zum Antworten