Przeładowanie(lewostronne) operatora +.

Przeładowanie(lewostronne) operatora +.
D3
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 8 lat
  • Postów:2
0

Szanowni forumowicze, pisząc program napotkałem pewien problem, którego za nic nie potrafię rozwiązać. Liczę, że z waszym doświadczeniem i wiedzą poradzicie sobie z nim bez trudu. Uczę się dopiero programować dlatego proszę o wyrozumiałość. Przejdę od razu do rzeczy. Otóż, piszę prosty program wykorzystujący klasy, gdzie chciałbym przeładować operator +(plusa). Wszystko jest ładnie i pięknie gdy później(w main'ie) chcę dodać do obiektu(klasy Pieniądze) liczbę(int'a), jednak na odwrót już pojawia się problem. Proszę was o pomoc w rowiązaniu tego problemu, jak dodać do liczby(int'a) obiekt(klasy Pieniadze). Wiem, że wiąże się to z przeładowaniem operatora, jednak ta wiedza nie wiele mi pomaga. Ponadto zależy mi na rozwiązaniu, które mieściło by się w obrębie klasy, nie poza nią.

Kopiuj
#include <iostream>

using namespace std;

class Pieniadze
{
private:
    int grosze;
    int zlotowki;

public:
    int get_g(){return grosze;}	//Getter.//
    int get_z(){return zlotowki;}	//Getter.//
    int ustaw(int g)	//Setter.//
    {
        if(g<0)
        {
            zlotowki = 0;
            grosze = 0;
        }
        else
        {
            zlotowki = g/100;
            grosze = g%100;
        }
    }
    void wypisz(){cout << grosze << " " << zlotowki << endl;}	//Funkcja wypisująca dane składowe klasy.//

    Pieniadze operator+(Pieniadze p)	//Przeładowanie operatora +(plusa).//
    {
        return Pieniadze(grosze + p.grosze, zlotowki + p.zlotowki);
    }
    Pieniadze(int g, int z)	//Konstruktor dwu-argumentowy.//
    {
        if((z*100 + g)<0)
        {
            zlotowki = 0;
            grosze = 0;
        }
        else
        {
            zlotowki = (z*100 + g)/100;
            grosze = (z*100 + g)%100;
        }
    }
    Pieniadze(int g)	//Konstruktor jedno-argumentowy.//
    {
        if(g<0)
        {
            zlotowki = 0;
            grosze = 0;
        }
        else
        {
            zlotowki = g/100;
            grosze = g%100;
        }
    }
    Pieniadze()	//Konstruktor bez-argumentowy.//
    {
        zlotowki = 0;
        grosze = 0;
    }
    ~Pieniadze(){}	//Destruktor.//
};

int main()
{
    Pieniadze tysiac(1000);

    Pieniadze suma1 = tysiac + 20;	//To się ładnie kompiluje.//
    suma1.wypisz();
    Pieniadze suma2 = 20 + tysiac;	//Tu już jest problem, o który mi się rozchodzi :/.//
    suma2.wypisz();

    return 0;
}

Z góry dziękuję i pozdrawiam :).

xfin
  • Rejestracja:ponad 11 lat
  • Ostatnio:10 miesięcy
  • Lokalizacja:Genewa
  • Postów:597
0

Można też tak:

Kopiuj
Pieniadze operator+ (Pieniadze p, int i) {
//...
}
Pieniadze  operator+ (int i, Pieniadze p) {
//...
}
kq
A nie lepiej Pieniadze po obu stronach? (najlepiej z const&amp;). Konstruktor nie jest explicit, więc niejawna konwersja zadziała
xfin
W sumie też można :D Nie wiem, ale czemu skupiłem się na tych intach.
D3
Jedno pytanko, czy taka deklaracja może znaleźć się wewnątrz klasy? Bo codeblocks pluje mi, że musi być 1 lub 0 argumentów, podczas gdy tu są 2.
kq
Tylko jeśli jest friendem, czyli de-facto poza klasą. Ale nie używaj friend nadaremno.
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 dni
  • Lokalizacja:Szczecin
1

Zdefiniuj dwuargumentowy operator+ poza klasą.


D3
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 8 lat
  • Postów:2
0

Dziękuję ślicznie wszystkim zainteresowanym, za pomocne odpowiedzi :). Pytanie dla poszerzenia wiedzy ogólnej, czy istnieje rozwiązanie, które mieściłoby się w obrębie klasy? Jeśli tak, to czy jest ono trudne dla początkującego? Pozdrawiam :).

Xupicor
  • Rejestracja:prawie 17 lat
  • Ostatnio:ponad 8 lat
0

Możesz mieć przeładowany operator, który jest metodą, ale wtedy znajdziesz się dokładnie w sytuacji, której chcesz uniknąć.

Co prawda można sobie zrobić własne suffixy i mieć na ten przykład:

Kopiuj
Piniondz p {30};
auto = 20_piniendzy + p;

Ale to nie zmienia faktu, że 20 + p ani 20 + 25_piniendzy już nie zabangla. ;)


edytowany 1x, ostatnio: Xupicor

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.