przeładowanie operatorów DEV C++ błąd

Odpowiedz Nowy wątek
2016-01-09 08:42
Pijany Samiec
0

Witam.

Mam taki mały problem, że Dev C++ wyrzuca mi błąd związany z operatorami, a ten sam kod pod Visual Studio działa bez zarzutu:

using namespace std;

class point2d{
    private:
        double x;
        double y;
    public:
        point2d():x(0),y(0){};
        point2d(double x,double y):x(x),y(y){};
        point2d(const point2d &p):x(p.x),y(p.y){};

        void Write(){cout<<"X= "<<x<<" Y="<<y<<endl;}

        // operator podstawiania

        inline void operator =(point2d &p){x = p.x; y = p.y;}; // proste podstawienie

        // Operatory matematyczne

        inline void operator +=(point2d &p){x += p.x; y += p.y;};
        point2d operator +(const point2d &p){point2d p1(x + p.x, y + p.y); return p1;};
};

int main(){

    point2d p(10,20);
    point2d p2 = p;
    p += p2;
    p.Write();
    p = p + p2; // tutaj testowanie działania powoduje błąd: Error] no match for 'operator=' in 'p = point2d::operator+(point2d&)((*(point2d*)(& p2)))' 

    system("PAUSE");

    return 0;
}

Czy da się to jakoś po ludzku w DevC++ zrobić?

Pozostało 580 znaków

2016-01-09 09:16
kq
0

Dev-C++ jest starym środowiskiem (przynajmniej ta wersja z 2005, która nie wiedzieć czemu trzyma popularność na wielu uczelniach), którego nie powinieneś używać.

Kod wygląda "ok", ale:

  1. operatory zwracają void, wtf?
  2. operatory przyjmują non-const referencje - dlaczego?
  3. operator+ powinien być implementowany w kontekście operatora+= i nie powinien być członkiem klasy (po lewej stronie możesz mieć coś co konwertuje się do point2d)
  4. system("PAUSE") to zło. Za złapanie konsoli powinno odpowiadać środowisko wykonania.

edytowany 1x, ostatnio: kq, 2016-01-09 10:43
Baaaardzo stare, 7 miesięcy od ostatniego update ;P http://sourceforge.net/projects/orwelldevcpp/ - _13th_Dragon 2016-01-09 10:37
Patrząc po błędach jakie dostaje to stawiałbym na to, że ma tę starą wersję, a nie Orwella z w miarę nowym mingw/gcc. - kq 2016-01-09 10:38
Moment, jak zauważysz że ktoś używa Visuala 2005 to stwierdzisz że: - "Visual jest starym środowiskiem, którego nie powinieneś używać."? - _13th_Dragon 2016-01-09 10:41
Ładniej? :) - kq 2016-01-09 10:43
Oczywiście, o ile mówiąc o Visualu używasz - " ... jest bardzo starym środowiskiem" ;P - _13th_Dragon 2016-01-09 10:48

Pozostało 580 znaków

2016-01-09 09:40
Pijany Samiec
1

Ok, rozumiem i poprawiłem tak, że działa poprawnie:

using namespace std;

class point2d{
    private:
        double x;
        double y;
    public:
        point2d():x(0),y(0){};
        point2d(double x,double y):x(x),y(y){};
        point2d(const point2d &p):x(p.x),y(p.y){};

        void Write(){cout<<"X= "<<x<<" Y="<<y<<endl;}

        // operator podstawiania

        point2d & operator =(const point2d &p){
            x = p.x;
        y = p.y;
        return *this;}; // tutaj był błąd, przez który DevC++ wywalał błąd

        // Operatory matematyczne

        inline void operator +=(const point2d &p){x += p.x; y += p.y;};
        /*point2d operator +(point2d p){
            point2d p1(x + p.x, y + p.y);
            return p1;};*/ // wywaliłem na zewnątrz
};

point2d operator +(const point2d &p1, const point2d &p2){ // obsługa operatora dodwania
    point2d p = p1;
    p += p2;
    return p;
}

int main(){

    point2d p(10,20);
    point2d p2 = p;
    p += p2;
    p.Write();
    p = p2 + p;
    p.Write();

    // tutaj wywaliłem system("PAUSE");
    cout<<"Wciśnij dowolny przycisk aby zakończyć program.";
    getch();

    return 0;
}

Mam nadzieję, że już teraz jest dobrze.

Pomijając Write jako członka klasy i dość słabe formatowanie (polecam http://format.krzaq.cc ) to wygląda ok. No i z tego co rozumiem działa :) - kq 2016-01-09 09:45
Ale tutaj to zrobił :P - kq 2016-01-09 10:42
Kurka, chyba jeszcze się nie obudziłem. - _13th_Dragon 2016-01-09 10:46

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