Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z przeciążeniem operatora <<

Ostatnio zmodyfikowano 2014-11-19 20:17
Autor Wiadomość
inomushis
Temat założony przez niniejszego użytkownika
Problem z przeciążeniem operatora <<
» 2014-11-19 19:20:35
Cześć. Szukam pomocy związanej z przeciążaniem operatorów w C++.
Programując zadanie na zaliczenie natknąłem się na problem z przeciążeniem <<.
Istnieje pewna klasa point, która zawiera współrzędne punktu w przestrzeni 3D przechowywane w tablicy:
C/C++
class point {
    double wsp[ 3 ];
}

Poza klasą zdefiniowano przeciążony operator +. Dzięki niemu możemy dodawać do siebie dwa punkty tworząc trzeci. Dodawanie polega na sumowaniu współrzędnych. Zdefiniowano też operator << przekierowujący współrzędne punktu w czytelnej formie do strumienia.
C/C++
point operator +( point a, point b ) {
    point new;
    for( unsigned int i = 0; i < 3; i++ ) {
        new[ i ] = a[ i ] + b[ i ];
    }
    return new;
}
ostream & operator <<( ostream & output, point & p ) {
    return output << "x = " << p[ 0 ] << "\n"
    << "y = " << p[ 1 ] << "\n"
    << "z = " << p[ 2 ] << "\n";
}

Oba operatory osobno działają prawidłowo. + dodaje do siebie współrzędne, << wypisuje współrzędne do strumienia.
Na czym polega problem? Otóż:
C/C++
point srodek( 10, 10, 10 ); cout << srodek; //Działa poprawnie - wypisanie punktu na ekran.
point naroznik(); naroznik = srodek + srodek; cout << naroznik; // Działa poprawnie - wypisanie wyniku dodawania na ekran.
cout << srodek + srodek; // Zwraca błąd!
Zwracany błąd jest następujący:
[Error] no match for 'operator<<' in 'std::cout << operator+(p1, p2)'

Skoro operator + dodaje do siebie oba punkty i zwraca wynik jako nowy punkt, to zapis 
cout << srodek + srodek;
powinien zostać potraktowany identycznie jak
cout << 2 + 7;
, a więc do strumienia powinien trafić wynik tego, co zrobi operator. W naszym przypadku zwróci on nowy obiekt klasy point, a operator << jest już przygotowany, by przekazać go do strumienia cout. Dlaczego zatem kompilator żąda całkiem innego operatora, który wyprowadził by do strumienia wynik dodawania?

Z góry dzięki za pomoc!
P-121000
Monika90
» 2014-11-19 19:29:29
C/C++
point new;
new to jest słowo kluczowe, nie może być użyte jako nazwa zmiennej.

C/C++
ostream & operator <<( ostream & output, point & p ) {
tak zadeklarowany operator można wywołać tylko dla L-wartości, a
srodek + srodek
 to jest R-wartość.

C/C++
point naroznik(); naroznik = srodek + srodek; cout << naroznik; // Działa poprawnie - wypisanie wyniku dodawania na ekran.
naroznik to funkcja
P-121001
inomushis
Temat założony przez niniejszego użytkownika
» 2014-11-19 20:00:44
Tak to jest jak się pisze coś na szybko.
Oczywiście nie new, a nowy, oraz nie
point naroznik();
 tylko
point naroznik;
 - konstruktor domyślny ustawia współrzędne punktu na 0, 0, 0 i to jak najbardziej działa.

Czyli należy stworzyć operator odwołujący się do R-wartości (&&). Dzięki!
P-121004
Monika90
» 2014-11-19 20:17:17
Czyli należy stworzyć operator odwołujący się do R-wartości (&&). Dzięki!
Nie. Należy stworzyć operator który działa i z L-wartościami, i z R-wartościami. Jak użyjesz && to będzie działał tylko z R-wartościami, wiec nie da się wydrukować wartości nazwanej zmiennej.

Po prostu przekazuj point przez
const point &
P-121011
« 1 »
  Strona 1 z 1