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



  • Habe eine Klasse

    welche ein int array enthält.

    über den operator:

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

    kann ich den int wert an der stelle (index) anfordern

    bsp.:

    int k= objekt[index];
    

    nun will ich aber auch den int wert am index setzen könnne also so:

    objekt[index]=5;
    

    wie muss ich den operator[] überladen damit das funzt?



  • wie muss ich den operator[] überladen damit das funzt?

    In dem du eine Referenz auf, statt einer Kopie des, entsprechenden ins zurücklieferst.

    inline int& operator[](const int &index){
       ...
    }
    

    In dem Fall musst du dir allerdings etwas für den "out-of-bounds"-Zugriff einfallen lassen: eine Exception, ein Assert, ein benanntes (statisches) "existiert-nicht"-Objekt...



  • 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!


Log in to reply