Overload dell'operatore ++

di Anonimizzato11270 il
3 risposte
Salve!
Mi sono imbattuto nella seguente difficoltà: a lezione mi è stato spiegato che per effettuare l'overload dell'operatore ++ si deve distinguere tra pre-incremento e post-incremento.
Faccio riferimento a una classe molto semplice, di 3 interi (x,y,z), che chiamo "punto".
Per effettuare un pre-incremento è sufficiente una sintassi come
punto punto::operator ++() {return(*this ++);
Per il post-incremento, invece, mi è stato detto che bisogna ricorrere a un "trucco":
punto punto::operator ++(int) {punto temp; x++; y++; z++; return(temp); }
Tutto ciò funziona quasi sempre, infatti ho notato che nel caso dell'istruzione
x=x++;
nel caso di un int restituisce x+1, nel caso di un punto restituisce x.

Il problema risiede nel fatto che quello definito non è davvero un "post-incremento", infatti l'incremento viene fatto prima, ma poi viene "nascosto" e si ritorna il valore precedente.

Come si può definire un reale post-incremento con queste istruzioni?
Grazie

3 Risposte

  • skynet ha scritto:


    La definizione corretta è questa
    
    class X { 
      X& operator++()
      {
        // do actual increment
        return *this;
      }
      X operator++(int)
      {
        X tmp(*this); 
        operator++();
        return tmp; 
      }
    }; 
    
    Preso da quà
    http://stackoverflow.com/questions/4421706/operator-overloading
    Questo è il problema. Usando questa definizione, dopo
     nomeclasse a; 
    a=a++; 
    a.stampa(); 
    in a c'è lo stesso valore da cui si era partiti, tranne nel caso in cui a è un intero. Usando l'operatore ++ del c, infatti,
     int a; 
    a=a++; 
    cout<<a; 
    il valore stampato è a+1.

    Mi chiedevo come e se fosse possibile estendere in modo naturale l'operatore "int++".
Devi accedere o registrarti per scrivere nel forum
3 risposte