Problem z przeciążeniem operatora <<
Ostatnio zmodyfikowano 2014-11-19 20:17
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: 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. 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óż: point srodek( 10, 10, 10 ); cout << srodek; point naroznik(); naroznik = srodek + srodek; cout << naroznik; cout << srodek + srodek;
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! |
|
Monika90 |
» 2014-11-19 19:29:29 new to jest słowo kluczowe, nie może być użyte jako nazwa zmiennej. 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ść. point naroznik(); naroznik = srodek + srodek; cout << naroznik;
|
naroznik to funkcja |
|
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! |
|
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 & |
|
« 1 » |