Dlaczego nie zmieniaja sie atrybuty prywatne klasy

0

Mam pytanie odnosnie metody odleglosc ktora oblicza "odleglosc" jednego pktu od drugiego. Skoro wywoluje konstruktor domyslny cout << p.odleglosc(punkt()) << '\n'; z parametrami (0,0).To atrybuty prywatne klasy x_,y_ = 0 . Natomiast gdy zaczyna obliczac pierw 2 stopniasqrt((x_-r.x_)(x_-r.x_)+(y_-r.y_)(y_-r.y_) to x_ = 0 i y_ = 0 jak najbardziej poczatek ukladu wspolrzednego dlatego wartosc 0 natomiast podczas "wywolywania konstruktora" nie zmienily sie wartosci prywatne obiektu klasy r czyli r.x_=0 i r.y_=0 (Wiem ze to by nie mialo sensu ale nie rozumiem po prostu gdy wywoluje konstruktor to przeciez zmieniam atrybuty prywatne to dlaczego nie zmienily sie atrybuty prywatne obiektu r ? przeciez dzialam caly czas na obiekcie p klasy ** punkt** ). Czy to jest dlatego ze dla kazdego konstruktora sa tworzone prywatne atrybuty za pomoca wskaznika this ?

#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;
class punkt{
    double x_,y_;
public:
    punkt():x_(0),y_(0){};
    punkt(double x,double y):x_(x),y_(y){};
    double &x(){return x_;}
    double &y(){return y_;}
    const double &x()const {return x_;}
    const double &y()const {return y_;}
    double odleglosc(const punkt& r)const {return sqrt((x_-r.x_)*(x_-r.x_)+(y_-r.y_)*(y_-r.y_));}
};
int main()
{
   punkt p(2, 3);
    cout << p.x() << ' ' << p.y() << '\n';
    p.x() = 7;
    p.y() = 8;
    cout << p.x() << ' ' << p.y() << '\n';
    cout << p.odleglosc(punkt()) << '\n';
    return 0;
}

 

Wiem ze strasznie zamotalem!

0

Czytałem kilka razy i nie rozumiem. Co powinno się stać, co się nie stało?

0

Dlaczego podczas wywolywania konstruktora domyslnego w metodzie odleglosc nie zmienily sie takze wartosci r.x_ i r.y_ ? (wiem ze wtedy sensu by nie miala metoda odleglosc)

2

Nie wywołujesz żadnego konstruktora w metodzie odleglosc. Przed jej wywołaniem tworzysz obiekt punkt, który w tej metodzie jest dostępny jako r, i jego wartości x_ i y_ są równe 0 - bo tak zostały ustawione w konstruktorze domyślnym.

0

Okej a dlaczego r.x_ i r.y_ nie sa rowne 0 (wiem ze funkcja wtedy sensu by nie miala). Nie rozumiem dlaczego zostaly wartosci r.x_ = 7 , r.y_ = 8

0

Nigdzie nie ustawiasz r.x_ i r.y_ na 7 i 8. Ustawiasz p!

0

współrzędne r w Twojej member funtion to 0 0

sqrt((7)(7)+(8)(8) = 10.6301458127

edit:
wszystko przez zły design;

napisz sobie funkcję

double distance(point const& p1, point const& p2)
{

}

0

Czyli to nie jest tak sqrt((0-7)(0-7)+(0-8)(0-8) = 10.6301458127 ?

1

nie, jest dokładnie odwrotnie: sqrt((7-0)(7-0)+(8-0)(8-0)) = 10.6301458127

0

Ja juz nie wiem co sie dzieje
p.odleglosc(punkt()) Tutaj wywoluje metode odleglosc na rzecz obiektu p ale w nawiasie jest punkt() czyli konstruktor domyslny w tym wypadku

2

No właśnie. Ten nowy punkt utworzony z domyślnymi wartościami jest przekazywany jako r.

ten kod jest praktycznie identyczny:

Punkt p;
p.x() = 7;
p.y() = 8;
Punkt INNY_PUNKT;
p.odleglosc(INNY_PUNKT);
0

Czyli x_ i y_ to sa atrybuty prywatne obiektu p (ktore przeciez nie zostaly zmienione!!!) i to dlatego one maja wartosci 7 i 8 natomiast r.x_ i r.y_ to sa nasze nowe "zmienne pomocnicze" ktore otrzymalismy przez przyjecie do metody odleglosc argumentu punkt() czyli konstruktora domyslnego ? maja za zadanie pomoc obliczyc to co ma robic metoda . Dobrze zrozumialem ?;d

1

Można to tak określić. Pamiętaj jednak, że private/protected/public to kwalifikatory dostępu, a Ty tak naprawdę mówisz o tym, że x_ i y_ są członkami klasy i dla każdej jej instancji mają inne wartości.

string a("foo");
string b("bar");

Czy oczekujesz, że b będzie równe a, czyli oba będą zawierały "bar"? Nie? To czemu oczekujesz analogicznego zachowania po następującym:

Punkt PIERWSZY_PUNKT(7,8);
Punkt ZUPELNIE_INNY_PUNKT(0,0);
0

Czytalem gdzies ze przypisac wartosci konstruktorowi mozna tylko w czasie definicji obiektu klasy czyli "mowic o nim mozna caly czas z tego wynika?" Nie wiem dlaczego ciagle mi z tym "wywolaniem konstruktora domyslnego w glowie siedzi".

Czyli tutaj przyjmuje sobie konstruktor domyslny dzieki ktoremu jestem w stanie policzyc cos w metodzie ? (zazwyzczaj przekazywalem jakies zmienne(wartosci np 10 ) do funkcji a tutaj widze ze konstruktor przekazywany jest po przez wartosc) .

Od niedawna ruszylem klasy ale jeszcze nie bardzo idzie mi ;p

1 użytkowników online, w tym zalogowanych: 0, gości: 1