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

Co lepiej zwracać operatorem '+' przy klasie?

Ostatnio zmodyfikowano 2017-01-07 01:48
Autor Wiadomość
czaffik
» 2017-01-06 19:01:33
Tak więc tak:
C/C++
const Typ & operator +( const int & x )
{
    a += x;
    return * this;
}
robisz to jako funkcję składową, const zabezpiecza przed zmianą zwracanego obiektu a referencja zapewnia że nie zwracasz kopii tylko bezpośrednio obiekt.
Potem możesz dalej robić tak:
C/C++
Typ a( 1, 2 );
Typ b( 2, 2 );
Typ c;
c = b + 2;
No chyba że nie o taki operator ci chodzi.
P-156122
latajacaryba
Temat założony przez niniejszego użytkownika
» 2017-01-06 19:26:48
Na pewno nie może modyfikować obiektu na który wskazuje this.


C/C++
a += x;
return * this;
 

Po kolei. Chcę, by operator '+' NIE zmieniał zawartości this, czyli nie chodzi mi o powyższy zapis.
Chcę również, by nie tworzył on nowego obiektu na wzór *this, czyli
C/C++
Typ wynik = * this;
wynik.a += x;
return wynik;
 też nie wchodzi w gre.
Chcę, jakby przesłać kopie obiektu na rzecz którego wywołujemy ten operator. Czy jest to możliwe? Chce taki operator jaki napisałeś, tylko BEZ (trwałego) modyfikowania *this. Czy coś takiego jest możliwe jako funkcja składowa?
P-156127
czaffik
» 2017-01-06 19:34:52
W takim razie nie, będziesz musiał utworzyć nowy obiekt aby do niego przekopiować wartości i je zwrócić, innego wyjścia nie ma.
Najlepiej to zrobić jako operator zewnętrzny, oba argumenty przyjąć przez const referencję i zwrócić przez const referencję, ale nie obędzie się bez tworzenia tymczasowego obiektu wewnątrz funkcji. Jak chcesz zwracać this które będzie reprezentować zmiany to siłą rzeczy trzeba ten obiekt zmodyfikować.
P-156128
latajacaryba
Temat założony przez niniejszego użytkownika
» 2017-01-06 20:26:28
O taką odpowiedź mi chodziło, dzięki

Wyglada w takim razie na to, że przy funkcji nie-składowej muszę sobie zorganizować konstruktor kopiujący. Ale po co przesyłać argumenty przez const referencję, skoro jeden z nich będziemy modyfikować?

czy chodziło Ci o coś takiego:
C/C++
const Zlozona & operator +( Zlozona obj, int a ) // jesli obj przesle przez const & to jest problem, nie wolno modyfikowac
{
    obj.rzeczywista += a;
    return( obj );
}
?
I jeszcze jedno: co jest złego w zwracaniu przez kopie?

@down
Właśnie o to mi chodzi, ze jeden będziemy modyfikować, więc lepiej przez kopie (wartość)
P-156130
karambaHZP
» 2017-01-06 20:52:13
Ale po co przesyłać argumenty przez const referencję, skoro jeden z nich będziemy modyfikować?
Tylko, że to nie trzyma się kupy.
Operator dodawania nie powinien modyfikować operandów, tylko zwrócić wynik dodawania, czyli coś zupełnie nowego.

Najlepiej gdyby operator += korzystał z już napisanego operatora+.

C/C++
#include <iostream>

class Foo {
    int a;
    int b;
public:
    Foo() = default;
    Foo( int a, int b )
        : a
    { a }, b { b } { }
    Foo( const Foo & ) = default;
   
    friend
    Foo operator +( const Foo & lhs, const Foo & rhs )
    {
        return Foo { lhs.a + rhs.a, lhs.b + rhs.b };
    }
   
    friend
    Foo & operator +=( Foo & lhs, const Foo & rhs )
    {
        lhs = lhs + rhs;
        return lhs;
    }
   
    friend
    std::ostream & operator <<( std::ostream & os, const Foo & foo )
    {
        return os << foo.a << ' ' << foo.b;
    }
};

int main()
{
    Foo f { 1, 2 }, ff { 3, 4 };
    Foo res = f + ff;
    std::cout << res << '\n';
    res += ff;
    std::cout << res << '\n';
    std::cout << f << '\n' << ff << '\n';
}
http://melpon.org/wandbox​/permlink/pBdxmrG04bgVfyYv
P-156132
michal11
» 2017-01-06 23:45:30
C/C++
const Zlozona & operator +( Zlozona obj, int a ) // jesli obj przesle przez const & to jest problem, nie wolno modyfikowac
{
        obj.rzeczywista += a;
        return( obj );
}

Gratuluję, zwracasz referencję do obiektu który już nie istnieje. Zresztą w takim przypadku i tak będzie robiona kopia jeżeli będziesz miał na przykład taki kod
C/C++
Zlozona a;
Zlozona b = a + 2;

@up

Powinno być na odwrót, nie operator+= który korzysta z operstora+ tylko operator+ powinien wykorzystywać operator+=, jak? To już było wczesnej w tym temacie pokazane.

Wracając do tematu, operator+ powinien zwracać nowy obiekt bo taka jest logika jego używania, tak wiec robienie kopii jest "złem koniecznymi". Jeżeli chcesz do swojego typu dodać inta to ja bym to napisał tak:
C/C++
Type operator +( Type lhs, int rhs )
{
    lhs.a += rhs;
    return lhs;

Tylko w tym wypadku musisz uważać z konstruktorem konwertującym z inta, bo cos takiego
Type a = 2 + 4;
 bedzie poprawnym wyrażeniem.
P-156143
latajacaryba
Temat założony przez niniejszego użytkownika
» 2017-01-07 01:48:13
I niech mi ktoś powie, że to wskaźniki są dla nowych wyzwaniem :D
Temat zamykam, jak będzie coś nowego to otworze inny, nie ma co tego ciągnąć przez kilka stron.
Dzięki za pomoc i pozdrawiam :)
P-156155
1 2 « 3 »
Poprzednia strona Strona 3 z 3