Błąd w kodzie - przeładowania operatorów
Ostatnio zmodyfikowano 2017-01-12 21:30
latajacaryba Temat założony przez niniejszego użytkownika |
Błąd w kodzie - przeładowania operatorów » 2017-01-12 20:51:20 Witam. Mam problem z operatorem (znowu). Tym razem jest to operator =, poniżej jest przykład do ctrl+c ctrl+v. Objaśnie o co mi chodzi: Spójrzcie na operator+. Zastanawia mnie jedna rzecz, mianowicie, dlaczego MUSI zwracać referencję, by zapis a = b + c był możliwy? Dlaczego nie możemy użyć kopii (przyjmie ją operator = ) a = b + c b+c zwraca KOPIE do zmodyfikowanego obiektu 'c'. Następnie operator = przyjmuje ten obiekt 'c' przez wartość. I wiadomo, this->a = c.a; itp. Następnie zwraca referencję do obiektu *this. A teraz pytanie - dlaczego operator + musi zwracać referencję? I przede wszystkim jak może ją zwrócić, skoro ma zwrócić referencję do obiektu przesłanego przez wartość? Czy tak w ogóle się da? #include <iostream> using namespace std; class Zlozona { public: int a; double b; int * wsk; Zlozona( int x = 1, double y = 1 ) : a( x ) , b( y ) { wsk = new int; * wsk = 5; } Zlozona( Zlozona & obj ) { a = obj.a; b = obj.b; wsk = new int; * wsk = *( obj.wsk ); } Zlozona operator +( Zlozona obj ) { obj.a += a; obj.b += b; *( obj.wsk ) += * wsk; return obj; } Zlozona & operator =( Zlozona obj ) { a = obj.a; b = obj.b; * wsk = *( obj.wsk ); return * this; } };
int main() { Zlozona a( 2, 2 ); Zlozona b( 2, 2 ); Zlozona c; cout <<( a + b ).a; c = a + b; }
|
|
karambaHZP |
» 2017-01-12 21:13:32 int main() { Zlozona a( 2, 2 ); Zlozona b( 2, 2 ); Zlozona c; cout <<( a + b ).a << '\n'; c = a + b; cout << c.a << '\n'; } |
|
Monika90 |
» 2017-01-12 21:21:31 W twoim konstruktorze kopiującym brakuje const. Zlozona( const Zlozona & obj ) { }
|
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2017-01-12 21:30:04 @Monika90 To chyba ostatnie miejsce, w którym bym szukał :D Niby był o tym log, ale nie zwracałem na to uwagi, ze względu na to, że jak pisałem po małej modyfikacji operator+ wszystko działało Dzięki i temat zamykam :) |
|
« 1 » |