Point2d c++

Odpowiedz Nowy wątek
2018-01-04 21:17
chytant
0

Hobbistycznie próbuje coś skrobaćw c++ i zabrałem się za tzw. Point2D. Jak ten kod usprawnić ? Po części wiem, że jest on napisany fatalnie ale o tyle o ile działa.
Za pomoc serdecznie dziękuje.

#include <iostream>
#include <cmath>

using namespace std;

class Point2d
{
private:
       int x;
       int y;
public:
       int getX()
       {
           return x;
       }
       int getY()
       {
           return y;
       }

        Point2d(int a, int b)
       {
             x = a;
             y = b;
       }
};

double dod(Point2d p1, Point2d p2)
{
    return p1.getX()+p2.getX(),p1.getY()+p2.getY();
}

double odej(Point2d p1, Point2d p2)
{
    return p1.getX()-p2.getX(),p1.getY()-p2.getY();
}

double dzie(Point2d p1, Point2d p2)
{
    return p1.getX()/2,p1.getY()/2;
}

double mnoz(Point2d p1, Point2d p2)
{
    return p1.getX()*2,p1.getY()*2;
}

double wypisz(Point2d p1, Point2d p2)
{
    return p1.getX(), p1.getY();
}

double dst(Point2d p1, Point2d p2)
{
       return sqrt(pow((p2.getX()-p1.getX()),2)+pow((p2.getY()-p1.getY()),2));
}

int main()
{
    Point2d p1(10,10);
    Point2d p2(10,10);
    Point2d p3();

    cout<<"p3 = p1 + p2  "<<dod(p1,p2)<<","<<dod(p1,p2)<<endl;
    cout<<"p3 = p1 - p2  "<<odej(p1,p2)<<","<<odej(p1,p2)<<endl;
    cout<<"p3 = p1/2     "<<dzie(p1,p2)<<","<<dzie(p1,p2)<<endl;
    cout<<"p3 = p1*2     "<<mnoz(p1,p2)<<","<<mnoz(p1,p2)<<endl;
    cout<<"Wypisz =      "<<wypisz(p1,p2)<<","<<wypisz(p1,p2)<<endl;
    cout<<"Distance      "<<dst(p1,p2)<<endl;
    return 0;
}
edytowany 1x, ostatnio: cerrato, 2019-09-02 14:50

Pozostało 580 znaków

2018-01-06 11:56
0

Poczytaj o przeciążeniu operatorów
Plus możesz poczytać jeszcze o this


Jeśli widzisz mój błąd to mnie popraw.
Pisanie błędnych wypowiedzi utrwala złe praktyki.
Kiedyś możesz dostać do ręki mój kod.
edytowany 2x, ostatnio: PanRiK, 2018-01-06 11:59

Pozostało 580 znaków

2018-01-06 23:33
1

A teraz przetestuj swój program z takimi danymi:

Point2d p1( 5, 10 );
Point2d p2( 50, 80 );

Pozostało 580 znaków

2018-01-07 11:35
chytant
0
tajny_agent napisał(a):

A teraz przetestuj swój program z takimi danymi:

Point2d p1( 5, 10 );
Point2d p2( 50, 80 );

Działa błędnie, wiem o tym, jak to rozwiązać ?

Pozostało 580 znaków

2018-01-07 13:29
1

Skoro dodajesz/odejmujesz/mnożysz/dzielisz dwa Point2d to zwracaną wartością również powinien być Point2d, a nie double.
Zamiast

double dod(Point2d p1, Point2d p2)
{
    return p1.getX()+p2.getX(),p1.getY()+p2.getY();
}

Zrób:

Point2d dod( const Point2d& p1, const Point2d& p2 )
{
  return Point2d( p1.getX() + p2.getX(), p1.getY() + p2.getY() );
}

No i takie coś return p1.getX(), p2.getX() nie działa tak jak myślisz. Return jeśli ma coś zwracać to tylko i wyłącznie jedną wartość.

Pozostało 580 znaków

2018-01-07 14:40
chytant
0
tajny_agent napisał(a):

Skoro dodajesz/odejmujesz/mnożysz/dzielisz dwa Point2d to zwracaną wartością również powinien być Point2d, a nie double.
Zamiast

double dod(Point2d p1, Point2d p2)
{
    return p1.getX()+p2.getX(),p1.getY()+p2.getY();
}

Zrób:

Point2d dod( const Point2d& p1, const Point2d& p2 )
{
  return Point2d( p1.getX() + p2.getX(), p1.getY() + p2.getY() );
}

No i takie coś return p1.getX(), p2.getX() nie działa tak jak myślisz. Return jeśli ma coś zwracać to tylko i wyłącznie jedną wartość.

Przy takim rozwiązaniu muszę dodać do:
int getX(), int getY() - const ?
Bo po zamienieniu kodu wartość obliczeń się nie wywołuje.

Pozostało 580 znaków

2018-01-07 15:48
0
    Point2D operator+ (Point2D &ob2){
        int x = this->x + ob2.x;
        int y = this->y + ob2.y;

        Point2D ob3 = Point2D(x,y);

        return ob3;

    }

Jest to bardziej czytelne.

Przeładować operator możesz tak dla każdego swojego działania.

Wywołujesz tak:

   Point2D a = Point2D(1,2);
   Point2D b = Point2D(3,4);
   Point2D c = a+b;

   std::cout << c.x << " " << c.y;

Edit:

chytant napisał(a):

Przy takim rozwiązaniu muszę dodać do:
int getX(), int getY() - const ?
Bo po zamienieniu kodu wartość obliczeń się nie wywołuje.

@tajny_agent Chodziło o to, że przy argumentach funkcji dajesz słowo kluczowe "const" po to, aby przypadkiem tych argumentów nie modyfikować podczas dodawania. Takie zabezpieczenie.


Jeśli widzisz mój błąd to mnie popraw.
Pisanie błędnych wypowiedzi utrwala złe praktyki.
Kiedyś możesz dostać do ręki mój kod.
edytowany 3x, ostatnio: PanRiK, 2018-01-07 16:01

Pozostało 580 znaków

2018-01-07 16:04
chytant
0

PanRik totalnie nie zrozumiałem Twojego przekazu.
Zgodnie ze wskazówkami tajny_agent podmieniłem kawałek kodu, ale program nie działa, coś jest nie tak z wywołaniem, tylko co ?

#include <iostream>
#include <cmath>

using namespace std;

class Point2d
{
private:
       int x;
       int y;
public:
       int getX() const
       {
           return x;
       }
       int getY() const
       {
           return y;
       }

        Point2d(int a, int b)
       {
             x = a;
             y = b;
       }
};

Point2d dod( const Point2d& p1, const Point2d& p2 )
{
  return Point2d( p1.getX() + p2.getX(), p1.getY() + p2.getY() );
}

int main()
{
    Point2d p1(10,10);
    Point2d p2(10,10);

    cout<<dod(p1,p2);
    return 0;
}
edytowany 1x, ostatnio: cerrato, 2019-09-02 14:50

Pozostało 580 znaków

2018-01-07 16:11
0
cout<<dod(p1,p2);

Próbujesz wyświetlić obiekt klasy Point2D.

Przeczytaj o przeciążeniu operatorów, naprawdę ten sposób co ja zrobiłem jest bardzo przyjemny.

Żeby Ci zobrazować to co wcześniej chciałem Ci przekazać:

#include <iostream>

class Point2D{

private:
    int x;
    int y;
public:

    int getX(){
        return this->x;
    }
    int getY(){
        return this->y;
    }

    Point2D(int x, int y){
        this->x = x;
        this->y = y;
    }

    Point2D operator+ (Point2D &ob2){
        int x = this->getX() + ob2.getX();
        int y = this->getY() + ob2.getY();

        Point2D ob3 = Point2D(x,y);
        return ob3;
    }
};

int main() {

   Point2D first = Point2D(1,2);
   Point2D secound = Point2D(3,4);
   Point2D afterSum = first + secound;

   std::cout << afterSum.getX() << " " << afterSum.getY();

    return 0;
}

I za pomocą przeciążenia operatorów, da się wyświetlić w taki sposób jak Ty chcesz ;)


Jeśli widzisz mój błąd to mnie popraw.
Pisanie błędnych wypowiedzi utrwala złe praktyki.
Kiedyś możesz dostać do ręki mój kod.
edytowany 3x, ostatnio: PanRiK, 2018-01-07 16:22

Pozostało 580 znaków

2018-01-08 18:56
chytant
0

PanRik - wielkie dziekuje, wszystko jasne :)

Pozostało 580 znaków

2019-09-02 14:47
0
Point2D operator+ (Point2D &o){
        x += o.getX();
        y += o.getY();

        return *this;
}

lub

Point2D operator+ (Point2D &o){return Point2D (x+o.gx(),y+o.gy(),z+o.gz());}
edytowany 3x, ostatnio: Krystian Zdziebło, 2019-09-02 15:02
Pokaż pozostałe 5 komentarzy
Szybko krytykujecie, zamiast pomyśleć... - Krystian Zdziebło 2019-09-02 16:43
A co tu jest do myślenia, skoro łamiesz podstawowe zasady? Polecam lekturę: https://dsp.krzaq.cc/post/304[...]wac-operatory-w-mojej-klasie/ - kq 2019-09-02 16:46
Gdy dojdziesz do pewnego poziomu tez zaczniesz ;) Nie ma co podawać ludziom ryby, bo jej nie docenią. Jednak docenią, jak podasz wędkę. Do pewnych spraw sami muszą dojść, to dla nich bardziej rozwojowe niż tępe przepisywanie kodu. - Krystian Zdziebło 2019-09-02 16:49
W tej analogii podajesz im zatrutą rybę, a nie wędkę. - kq 2019-09-02 17:28
Za to uzyskałem, to co chciałem uzyskać ;) - Dziękuję. - Krystian Zdziebło 2019-09-02 17:34

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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