przeładowanie operatora+, zwracanie referencji do obiektu

0

witam, mam klasę punkt i związany z jej obsługą operator+. Potrzebuję wykonać działanie: punkt - ( innyPunkt + zupelnieInnyPunkt ). Dodatkowym założeniem jest to aby funkcja operatorowa nie zmieniała wartości swoich argumentów. Próbowałem tak:

 
point& operator+(const point& p1, const point& p2)
{
    point temp;
    temp._x=p1._x - p2._x;
    temp._y=p1._y - p2._y;
    return temp;
}

ale to rozwiązanie jest parszywe ze względu na zwracanie referencji do obiektu tymczasowego co kończy się wynikami z ... nazwijmy to błędnymi. Użycie wskaźnika i przydzielenie pamięci na stercie raczej nie wchodzi w grę bo takie działanie będzie wykonywane co najmniej kilkukrotnie. Wiązałoby się to z ciągłym kasowaniem przydzielonej pamięci czego chcę uniknąć. Zastanawiam się jak do tego podejść :)

1

operator+ zwraca wartość a nie referencję

http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

1

Operator + powinien zwracać nowy obiekt, nie referencję do obiektu. Może się to wiązać z alokacją na stercie, jeżeli obiekt alokuje w konstruktorze. Nie ma prostego sposobu, żeby temu przeciwdziałać, choć możesz zobaczyć jak to jest rozwiązane w bibliotekach do obliczeń macierzowych, np. Armadillo. Zwracaj po prostu nowy obiekt, jak potem przetestujesz, że w programie skompilowanym z optymalizacjami jest przez tam spędzane dużo czasu, to spróbuj wtedy to zoptymalizować (choć używanie += także może być skuteczne).

0

dzięki, o tym zapomniałem :)

0

Może się to wiązać z alokacją na stercie, jeżeli obiekt alokuje w konstruktorze.
Temu z założenia ma przeciwdziałać konstruktor przesuwający (C++11), ale to powoduje masakryczną komplikację kodu (głupie dodanie pola do klasy trzeba jeszcze uwzględnić w około pięciu miejscach jak różne konstruktory, operatory).

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