[C++] Dubbio overloading operatore

starsuper
Ciao a tutti, per esercizio ho scritto questo codice, dovevo correggere alcune imperfezioni e farlo girare. Il codice gira, ma ho un dubbio.
#include <iostream>

using namespace std;


template <class T>
class point
{
    public:T x,y;
    
       point(T i1, T i2)
        {
        x=i1;
        y=i2;
        }
};

std::ostream& operator<<(std::ostream& out, const point<double>& p)
{
    //out<<p;
    out<<p.y;
    return out;
}

int main(int argc, const char * argv[]) {
    point<double> p= {5.2, 7.3};
    cout<<p.x<<" "<<p.y << std::endl;
    return 0;
}


Output: 5.2 7.3

1) come mai l'overloading dell'operatore funziona anche se dichiaro semplicemente out< 2)Stessa cosa con out<
In definitiva, come mai se l'operatore << assegna solamente uno dei due membri,stampa due membri diversi? grazie!

Risposte
Raptorista1
Quando fai cout<

starsuper
Grazie, scusami ma non ho capito che vuoi dire. Io richiamo un oggetto double e non un oggetto point, quindi richiamo il p dichiarato nel main?

In che senso la mia funziona non viene mai richimata?

Raptorista1
Voglio dire esattamente quello che c'è scritto.
Quando il compilatore esegue cout<

starsuper
cout è l'oggetto di tipo ostream che si becca il risultato dell'operatore << che è anch'esso un oggetto di tipo ostream, out. Si richiama l'operatore << passando come rvalue l'oggetto da trasferire nel cout ovvero point.

EDIT. Commentando la parte dell overload, il codice funziona lo stesso. Ora domanda,in questa situazione non c'è bisogno di fare l'overloading giusto? L'operatore << fa esattamente quello che dovrebbe fare e quindi non necessita di nessun adattamento giusto?

Raptorista1
"starsuper":
Ora domanda,in questa situazione non c'è bisogno di fare l'overloading giusto? L'operatore << fa esattamente quello che dovrebbe fare e quindi non necessita di nessun adattamento giusto?

No, no e no XD
Tutte e tre queste cose sono sbagliate.

"starsuper":
Si richiama l'operatore << passando come rvalue l'oggetto da trasferire nel cout ovvero point.

Quale sarebbe l'oggetto point?

starsuper
"starsuper":
Si richiama l'operatore << passando come rvalue l'oggetto da trasferire nel cout ovvero point.

Quale sarebbe l'oggetto point?
[/quote]

point<double> p= {5.2, 7.3};


Nel main dichiaro l'istanza della classe parametrica point

const point<double>& p


Qui nell overload passo un oggetto dello stesso tipo che ho dichiarato nel main!

Raptorista1
"starsuper":
passo un oggetto dello stesso tipo

Questo non è vero!

starsuper
"Raptorista":
[quote="starsuper"]passo un oggetto dello stesso tipo

Questo non è vero![/quote]


Mi spieghi per favore?

Raptorista1
cout<<p.x

È tutto qui.

vict85
Ti rendi conto che la tua classe è equivalente a questastruttura
template <typename T>
struct point {
    T x,y;
}
e che tutto ciò che ci hai aggiunto è codice inutile?

Venendo alla tua domanda. Il codice
std::cout<<p.x<<p.y<<std::endl;
è equivalente a scrivere
double const a = p.x;
std::cout<<a;
std::cout<<" ";
const double b = p.y;
std::cout<<b;
std::cout<<std::endl;
quindi chiama l'operatore relativo a double e non a point.

Per chiamare l'overload di point avresti dovuto chiamare
std::cout<<p;
.

Detto questo a me sembra che a te sia poco chiaro il concetto di membro e non quello di overload di operatore.

starsuper
Ricapitolando:

Dichiaro una classe template che ha due membri parametrici che saranno dello stesso tipo. Nel main creo un'istanza della classe, specificando che i suoi tipi sono di tipo float.

Classe: point

Tipi di dato : float

Creo un oggetto di tipo point che ha i membri di tipo float, e gli assegno un valore.

Richiamando p.x, stampo il membro x dell'oggetto p.

Quindi il cout prende p.x perche x è di tipo double!

Overloading: Se avessi usato cout<

Raptorista1
@vict: così mi togli il divertimento :(

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.