[C++] Dubbio overloading operatore
Ciao a tutti, per esercizio ho scritto questo codice, dovevo correggere alcune imperfezioni e farlo girare. Il codice gira, ma ho un dubbio.
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!
#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<
In definitiva, come mai se l'operatore << assegna solamente uno dei due membri,stampa due membri diversi? grazie!
Risposte
Quando fai cout<
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?
In che senso la mia funziona non viene mai richimata?
Voglio dire esattamente quello che c'è scritto.
Quando il compilatore esegue cout<
Quando il compilatore esegue cout<
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?
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?
"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":
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!
"starsuper":
passo un oggetto dello stesso tipo
Questo non è vero!
"Raptorista":
[quote="starsuper"]passo un oggetto dello stesso tipo
Questo non è vero![/quote]
Mi spieghi per favore?
cout<<p.x
È tutto qui.
Ti rendi conto che la tua classe è equivalente a questastruttura
Venendo alla tua domanda. Il codice
Per chiamare l'overload di point avresti dovuto chiamare
Detto questo a me sembra che a te sia poco chiaro il concetto di membro e non quello di overload di operatore.
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.
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<
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<
@vict: così mi togli il divertimento

Ciao! Sono il tuo Tutor AI, il compagno ideale per uno studio interattivo. Utilizzo il metodo maieutico per affinare il tuo ragionamento e la comprensione. Insieme possiamo:
- Risolvere un problema di matematica
- Riassumere un testo
- Tradurre una frase
- E molto altro ancora...
Il Tutor AI di Skuola.net usa un modello AI di Chat GPT.
Per termini, condizioni e privacy, visita la relativa pagina.
Per termini, condizioni e privacy, visita la relativa pagina.