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

Błąd w kodzie - przeładowania operatorów

Ostatnio zmodyfikowano 2017-01-12 21:30
Autor Wiadomość
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?

C/C++
#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 ) // przez wartosc, inaczej nie da rady bez tworzenia nowego obiektu
    {
        obj.a += a;
        obj.b += b;
        *( obj.wsk ) += * wsk;
        return obj; // zwraca przez wartosc obj (zmodyfikowany)
    }
    Zlozona & operator =( Zlozona obj ) //przyjmuje przez wartosc
    {
        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; //dziala, wynik 4
    c = a + b; // nie dziala ;(
}
P-156367
karambaHZP
» 2017-01-12 21:13:32
C/C++
int main()
{
    Zlozona a( 2, 2 );
    Zlozona b( 2, 2 );
    Zlozona c;
    cout <<( a + b ).a << '\n'; //dziala, wynik 4
    c = a + b; // nie dziala ;(
    cout << c.a << '\n'; // działa, wynik 4
}
P-156370
Monika90
» 2017-01-12 21:21:31
W twoim konstruktorze kopiującym brakuje const.
C/C++
Zlozona( const Zlozona & obj )
{
    //...
}
P-156371
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 :)
P-156372
« 1 »
  Strona 1 z 1