Point2d c++

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;
}
0

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

1

A teraz przetestuj swój program z takimi danymi:

Point2d p1( 5, 10 );
Point2d p2( 50, 80 );
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ć ?

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ść.

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.

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.

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;
}
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 ;)

0

PanRik - wielkie dziekuje, wszystko jasne :)

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());}
1

W tym przypadku podejście z operatorami wydaje się być OK, ale zalecałbym ogólną ostrożność ;)
Nazwa funkcji często więcej mówi o jej działaniu niż symbol operatora. A "to przecież oczywiste" bywa oczywiste w różny sposób zależnie od osoby ;).

Mój ulubiony przykład:

// zwykły "matematyczny" wektor w przestrzeni 2D - w zasadzie niczym nie różniący się od punktu z tego wątku ;)
Wektor2D w1 (1,1), w2 (2, 3);    
...

auto v1 = w1 + w2;
auto v2 = w1 * w2;

Pytania

  • jakiego typu będą v1 i v2 ?
  • co będą zawierać ?

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