PDA

View Full Version : [C++] ridefinizione operatore standard output


Isomarcus
26-11-2005, 11:15
Ciao a tutti,

sono incappato in un errore che non riesco a correggere :cry:

vi posto direttamente il codice. è un esempio molto stupido di una classe, non guardate ad esempio in che modo viene fatta la somma, è ridotto tutto a livelli molto semplici per isolare il più possibile l'errore (la stessa classe in sè è una vera idiozia ma la uso per trovare facilmente gli errori)

allora, come prima cosa ho ridefinito l'operatore somma:

reali operator+(reali x, reali y) {
int num=(x.numero()+y.numero());
int dec=(x.decimale()+y.decimale());
reali aux(num,dec);
return aux;
}

poi ho ridefinito l'operatore di standard output <<


ostream& operator<<(ostream& os, reali& x) {
return os<<x.numero()<<"."<<x.decimale()<<endl;
}


l'operatore somma funziona in quanto reali y(3,14), z(3,14), x=y+z; dà il risultato desiderato

il problema è l'operatore <<. se scrivo cout<<y; funziona senza problemi.
se scrivo cout<<y+z; invece dà una sfilza di errori.... del tipo "no match for operator<< in std:cout<<operator+(y,z)
e nn capisco perchè :muro:

la somma è definita e funziona, il << è definito e funziona, perchè se combino le due cose non funziona? mi sono dimenticato di qualcosa?


grazie mille a chi mi sarà d'aiuto :(

pela
26-11-2005, 11:49
intanto prova a mettere
ostream& operator<<(ostream& os, const reali& x) {
poi semmai posta gli errori che ti dà...

Isomarcus
26-11-2005, 12:19
ho già provato, se metto const non compila in nessun caso, dice

"passing 'const reali' at 'this' argument of int reali::numero() discards qualifier"

la stessa cosa per reali::decimale()

Qu@ker
26-11-2005, 13:53
goku@big:/tmp$ cat test.cpp
#include <iostream>

class reali
{
private:
int m_numero, m_decimale;
public:
int numero(void) const { return m_numero; }
int decimale(void) const { return m_decimale; }
reali(int numero, int decimale):
m_numero(numero), m_decimale(decimale) {}
};

std::ostream& operator <<(std::ostream& os, const reali& r)
{
return os << r.numero() << "." << r.decimale();
}

reali operator +(const reali& a, const reali& b)
{
return reali(a.numero() + b.numero(),
a.decimale() + b.decimale());
}

int main(void)
{
reali a(1, 2);
reali b(2, 4);

std::cout << a + b << std::endl;
}
goku@big:/tmp$ g++ test.cpp -Wall
goku@big:/tmp$ ./a.out
3.6
goku@big:/tmp$

Isomarcus
26-11-2005, 14:09
grazie a tutti, ci sono arrivato pure io :D

mancava il const... mettendelo e dichiarando const anche i due metodi implicati nell'operator<< (che in effetti hanno tutti i motivi per esserlo) compila correttamente :)