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

Przeciążanie operatorów na przykładzie operator +=

Ostatnio zmodyfikowano 2012-09-09 13:31
Autor Wiadomość
DejaVu
» 2012-09-07 21:37:32
Problemem nie jest fakt, że tworzy się kopia, tylko fakt, że tworzy się TYMCZASOWY obiekt, który jest niszczony zaraz po wykonaniu operacji.
P-64543
Mrovqa
» 2012-09-07 21:41:28
Jaka jest różnica między tymczasowym obiektem a kopią? Przecież to jest to samo. Poza tym problem - tymczasowy obiekt, a prędkość... jedno wynika z drugiego.
P-64544
DejaVu
» 2012-09-07 21:44:44
To nie jest to samo.
C/C++
CKlasa x;
CKlasa & y = x.kopia();
y.metoda();
W powyższym przypadku wywołanie metody z obiektu 'y' oznacza zgon aplikacji. Gdyby to była po prostu kopia, która pozostaje w pamięci to zgon by nie nastąpił (lecz co najwyżej wyciek pamięci).
P-64545
diego997
Temat założony przez niniejszego użytkownika
» 2012-09-07 21:45:00
tylko wiecie zwracam to *this a to praktycznie nic nie wnosi według mnie. Jak miałbym funkcje która zwraca int to bym wiedział po co zwracam int, a tutaj nie bardzo. Kurcze ciężkie to jest ;p Po prostu teraz jak posługuję sie tymi operatorami to na ślepo na końcu daje return *this. Ktoś by sie mnie zapytał po co na końcu dajesz return *this to bym mu jedynie odpowiedział że funkcja oczekuje na to bo mamy klas & funkcja();


Pewnie was strasznie denerwuje jak tak to sory ;p
P-64546
DejaVu
» 2012-09-07 21:48:51
Eh... uzasadnienie zwracania referencji:
C/C++
CKlasa & CKlasa::dodaj( int a )
{
    m_wynik += a;
    return * this;
}

int CKlasa::wynik() const
{
    return m_wynik;
}

//...
CKlasa klasa;
printf( "%d\n", klasa.dodaj( 1 ).dodaj( 5 ).dodaj( 7 ).dodaj( 30 ).wynik() );
P-64548
diego997
Temat założony przez niniejszego użytkownika
» 2012-09-07 21:52:13
WOW Dejavu czemu odrazu tego nie napisałeś :DDDD




EDIT: DZIĘKI Ci najmocniej wiesz że nieświadomie rozwikłałeś też moje wątpiwości na temat jak w sfmlu się można pozwoić sobie na taki zapis window.getLocalBound().width :D Dzięki jeszcze raz ok zamykam :)
P-64549
cyklopek11
» 2012-09-07 22:16:03
Operator jest funkcją więc może zwracać:
- void
- obiekt typu wbudowanego/obiekt klasy przez wartość
- obiekt typu wbudowanego/obiekt klasy przez referencję
- wskaźnik do typu wbudowanego/klasy

To co ma konkretnie zwracać zależy od jego zastosowania i wygody wykorzystania go. Np
Mam klasę A o następującej definicji:
C/C++
#include <iostream>
using namespace std;

class A
{
public:
    int calkowita;
    void operator -()
    {
        if( calkowita < 0 )
        {
            cout << "Obiekt zawiera w sobie liczbe mniejsza od zera" << endl;
        }
        else
        {
            cout << "Obiekt nie zawiera w sobie liczby mniejszej od zera" << endl;
        }
       
    }
    A() { }
    A( int cal )
        : calkowita( cal )
    { }
    ~A() { }
};

int main()
{
    A mojObiekt( 88 );
    - mojObiekt;
   
   
   
    cin.get();
    return 0;
}
 Chcę aby mój jednoargumentowy operator- działał w taki sposób aby wskazywał mi np. czy w obiekcie klasy A jest obiekt ujemny. Do dalszych etapów wynik tej operacji nie jest mi potrzebny, nie chcę nigdzie go przypisywać itd. Chcę to tylko zobaczyć na ekranie i nic więcej. Decyduję że mój operator ma zwracać void(wolno mi). Chcę również aby mój operator był praktyczny tzn. stawiam go przed obiektem mojej klasy (żadnych innych operacji) i otrzymuję informację jaką chcę. Stąd wymyśliłem definicję tego operatora taką jaką widzisz powyżej.
A teraz zapragnąłem czegoś innego, chcę żeby operato- na obiekty klasy A działał tak że zmienia znak pola calkowity na przeciwny a wynik dzialania zwraca jako osobny obiekt. W tym momencie powinienem go zdefiniować jak?
Musi zwracać obiekt klasy A przez wartość. A jak przez wartość to ja to muszę gdzieś zapisać prawda. Czyli w funkcji main będę potrzebował dodatkowej zmiennej. Więc:

C/C++
#include <iostream>


using namespace std;

class A
{
public:
    int calkowita;
    A operator -()
    {
        A tymczasowy;
        tymczasowy.calkowita = - this->calkowita;
        return tymczasowy;
       
    }
    A() { }
    A( int cal )
        : calkowita( cal )
    { }
    ~A() { }
};

int main()
{
    A mojObiekt( 88 );
    A mojPomocniczyObiekt;
    mojPomocniczyObiekt = - mojObiekt;
    cout << mojPomocniczyObiekt.calkowita << endl;
   
   
   
   
    cin.get();
    return 0;
}

Teraz myślę sobie kurcze jakie to niepraktyczne chciałbym oparatorem - zmieniać trwale znak skladowej całkowitej bez przypisywania do jakiejś pomocniczej zmiennej. Myślę, myślę aha w operatorze wynik zwrócę przez referencję ... do czego ? do obiektu na którym dokonam zmiany znaku więc zmieniam sobie definicję opartora na taką:

C/C++
#include <iostream>


using namespace std;

class A
{
public:
    int calkowita;
    A & operator -()
    {
        this->calkowita = -( this->calkowita );
        return * this;
       
    }
    A() { }
    A( int cal )
        : calkowita( cal )
    { }
    ~A() { }
};

int main()
{
    A mojObiekt( 88 );
   
    - mojObiekt;
    cout << mojObiekt.calkowita << endl;
   
   
   
   
    cin.get();
    return 0;
}

Zobacz jak teraz jest wygodniej. Nie znaczy to że trzeba zawsze zwracać referencję. Zależnie od potrzeby.
A co dodatkowo daje zwracanie referencji. Otóż moge sobie kaskadowo "podziałać" kilka razy z rzędu operatorami '-':
C/C++
#include <iostream>


using namespace std;

class A
{
public:
    int calkowita;
    A & operator -()
    {
        this->calkowita = -( this->calkowita );
        return * this;
       
    }
    A() { }
    A( int cal )
        : calkowita( cal )
    { }
    ~A() { }
};

int main()
{
    A mojObiekt( 88 );
   
    - - - - - - - - - - - mojObiekt;
    cout << mojObiekt.calkowita << endl;
   
    cin.get();
    return 0;
}

Oczywiście jakby zaistniała konieczność to w operatorze sobie moge nawet zwrócić wskaźnik do czegoś... Skompiluj powyższe kody a na pewno zakumasz te operatory. Oczywiście to samo odnosi się do innych operatorów.
P-64550
diego997
Temat założony przez niniejszego użytkownika
» 2012-09-07 22:29:47
@Cyklopek11 ja to na pewno przeczytam bo ciekawie się zapowiada ale jutro ok :) ?
P-64553
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona