Przeładowanie operatora +
Ostatnio zmodyfikowano 2016-06-20 14:34
Lakjon Temat założony przez niniejszego użytkownika |
Przeładowanie operatora + » 2016-06-19 23:39:10 Witam mam problem związany z operatorem +, a mianowicie miałem dla fragmentu: 1. class wektor 2. { 3. int *x, *y, *z; 4. public: 5. wektor ... 6. }; Stworzyć Funkcję operatorową + składową i globalną umożliwiającą dodanie współrzędnych poszczególnych wektorów. Od 2 godzin kręcę sie w koło. Gdyby nie wskaźniki w klasie poradziłbym sobie bez problemu, ale tak nie mam pojęcia jak to ugryźć. #include <iostream> using namespace std;
class wektor { int * x, * y, * z; public: wektor operator +( wektor v ); void ustaw( int ux, int uy, int uz ); void pokaz(); };
void wektor::ustaw( int ux, int uy, int uz ) { x = & ux; y = & uy; z = & uz; }
void wektor::pokaz() { cout << "skladowe wektora: "; cout << * x << " , " << * y << " , " << * z << endl; }
wektor wektor::operator +( wektor v ) { wektor wek; wek.* x = * x + v.* x; wek.* y = * y + v.* y; wek.* z = * z + v.* z; return wek; } int main() { wektor a, b, suma_wek; a.ustaw( 1, 1, 1 ); b.ustaw( 1, 2, 3 ); a.pokaz(); b.pokaz(); cout << "po dodaniu: "; suma_wek = a + b; suma_wek.pokaz(); return 0; }
|
|
carlosmay |
» 2016-06-20 01:12:06 wektor wektor::operator +( wektor v ) { wektor wek; * wek.x = * x + * v.x; * wek.y = * y + * v.y; * wek.z = * z + * v.z; return wek; }
W tej metodzie przypisywane są adresy lokalnych zmiennych do wskaźników. Po wyjściu z funkcji zmiennej przestają istnieć, więc późniejsze użycie tych wskaźników jest UB. void wektor::ustaw( int ux, int uy, int uz ) { x = & ux; y = & uy; z = & uz; } |
Aby wskaźniki wskazywały prawidłowe dane trzeba przekazać alokowaną pamięć i zadbać aby ta pamięć nie była zwolniona póki jest potrzebna, lub alokować pamięć konstruktorem, a metodą ustawiać konkretne wartości. np. wektor() : x { new int( 0 ) }, y { new int( 0 ) }, z { new int( 0 ) } { }
~wektor() { delete x; delete y; delete z; }
void wektor::ustaw( int ux, int uy, int uz ) { * x = ux; * y = uy; * z = uz; }
wektor wek; wek.ustaw( 1, 2, 3 );
Przeładowując operator + należy zadbać o pełną implementację, działającą dla różnych wariantów: obiekt + liczba liczba + obiekt obiekt + obiekttutaj jest podobny wątek |
|
Monika90 |
» 2016-06-20 12:12:05 wektor() : x { new int }, y { new int }, z { new int } { x = y = z = nullptr; }
Wyciek pamięci, a po wywołaniu ustaw(1,2,3) niezdefiniowane zachowanie. obiekt + liczba liczba + obiekt obiekt + obiekt
|
Ale do wektora dodawać liczbę? |
|
carlosmay |
» 2016-06-20 14:34:20 Wyciek pamięci, a po wywołaniu ustaw(1,2,3) niezdefiniowane zachowanie. |
Poprawiłem. Dlatego nie lubię gołych new i delete . Łatwo o błąd. Ale do wektora dodawać (...) |
Chyba późna pora dała znać o sobie. Faktycznie, nie ma to sensu w tym przypadku. |
|
« 1 » |