czaffik |
» 2017-01-06 19:01:33 Tak więc tak: 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: Typ a( 1, 2 ); Typ b( 2, 2 ); Typ c; c = b + 2;
No chyba że nie o taki operator ci chodzi. |
|
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. |
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 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? |
|
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ć. |
|
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: const Zlozona & operator +( Zlozona obj, int a ) { 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ść) |
|
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+. #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 |
|
michal11 |
» 2017-01-06 23:45:30 const Zlozona & operator +( Zlozona obj, int a ) { 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 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: 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. |
|
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 :) |
|
1 2 « 3 » |