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

Przeładowanie operatora +

Ostatnio zmodyfikowano 2016-06-20 14:34
Autor Wiadomość
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źć.

C/C++
#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;
}
 
P-149286
carlosmay
» 2016-06-20 01:12:06
C/C++
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.
C/C++
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.
C/C++
wektor()
    : x
{ new int( 0 ) },
y { new int( 0 ) },
z { new int( 0 ) }
{ }

~wektor()
{ delete x;
    delete y;
    delete z;
}

// i wtedy przypisujemy konkretne wartości
void wektor::ustaw( int ux, int uy, int uz )
{
    * x = ux;
    * y = uy;
    * z = uz;
}

// wywołanie w main()
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 + obiekt


tutaj jest podobny wątek
P-149289
Monika90
» 2016-06-20 12:12:05
C/C++
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ę?

P-149290
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.
P-149298
« 1 »
  Strona 1 z 1