przeciążenie opereratora +=

0

Witam,

Mam takie zadanie. "Napisać klasę Data, która posiada dzień, miesiąc, rok. Napisać dwa konstruktory. Konstruktor domyślny ma ustawić datę na 1 stycznia 2006 roku, inny konstruktor ma mieć parametry określające datę" oraz "Przeciążyć operator '+=' dodający do daty określoną liczbę dni".

Napisałem tyle:


#include <iostream>
#include <string>
using namespace std;

class Data
{
public:
    // pola
    int dzien;
    string miesiac;
    int rok;

    // konstruktor
    Data();
    // konstruktor param
    Data(int dzien, string miesiac, int rok);

    // przeladowany operator
    Data operator+=(int liczba);
};

// definicja konstruktora domyslnego
Data::Data()
{
    dzien = 1;
    miesiac = "styczen";
    rok = 2006;
}

// def konstruktora param
Data::Data(int aDzien, string aMiesiac, int aRok)
{
    dzien = aDzien;
    miesiac = aMiesiac;
    rok = aRok;
}

// def operatora ++
 Data Data::operator+=(int liczba)
{
    Data rezultat;
    rezultat.dzien = this->dzien + liczba;

    return rezultat;
}

// deklaracja
void pokaz(Data ddd);

int main()
{
    Data data, data2;

    data = dzien+=5;
    pokaz(data);

    return 0;
}

void pokaz(Data ddd)
{
    cout << "dzien " << ddd.dzien
        << " miesiac " << ddd.miesiac
        << " rok " << ddd.rok << endl;
}

Wywala mi errora w GCC
In function 'int main()':
error: 'dzien' was not declared in this scope

0

W funkcji main masz błąd, jak zresztą kompilator wyraźnie stwierdza. Dokładnie tu:

data = dzien+=5;

Co to za zmienna dzien? Deklarowałeś ją gdziekolwiek?

0

data +=5;

1

data = dzien+=5;

Co to za twór w ogóle? Umiesz używać języka w ogóle?

Angielskiego też nie umiesz? Szkoda... bo taki ładny, prosty komunikat dostałeś.

Dodajesz "dzien" ktory nie jest w ogole zdefiniowany. Poza tym klasa mega brzydka, zrób sobie miesiac za pomoca cyfry i wtedy bedziesz mogl dodawac dwie daty do siebie, a nie tylko dni. Poza tym dodanie daty nie polega tylko na dodaniu liczb, musisz sprawdzic czy ilosc dni nie przekroczyla limitu i wtedy dodac jeden do miesiaca, jesli zas miesiace przekroczyly limit, musisz dodac jeden do roku :)

0

poza tym

Data::operator+=

moim zdaniem nie powinien nic zwracać.

0

Poprawiłem tak:


...
int main()
{
    Data data;

    data.dzien+=5;
    pokaz(data);

    return 0;
}
...
0

W ten sposób nie używasz swojego przeciążonego operatora. Poza tym co będzie jak będziesz mieć 30 września? Dodasz 5 i będzie 35 września. Chyba nie za bardzo poprawnie :P

0

Poprawiłem klasę Data na int miesiac, poprawiłem przeciążony operator +=. Jednak kod nie działa jak powinien.
Dla += 32 dostaje: dzień 3, miesiac 11, rok 2011. Jednak przy += 62 dostaje: 33 dzień, miesiąc 11, rok 2011.
Nie podoba mi się tak linijka: rezultat.dzien = dzien + liczba;


#include <iostream>
#include <string>
using namespace std;

class Data
{
public:
    // pola
    int dzien, miesiac, rok;

    // konstruktor
    Data();
    // konstruktor param
    Data(int dzien, int miesiac, int rok);

    // przeladowany operator
    Data operator+=(int liczba);
};

// definicja konstruktora domyslnego
Data::Data()
{
    dzien = 1;
    miesiac = 10;
    rok = 2011;
}

// def konstruktora param
Data::Data(int aDzien, int aMiesiac, int aRok)
{
    dzien = aDzien;
    miesiac = aMiesiac;
    rok = aRok;
}

// def operatora +=
Data Data::operator+=(int liczba)
{
    Data rezultat;

    if (liczba == 0)
        return rezultat;

    rezultat.dzien = dzien + liczba;

    if (rezultat.dzien > 30)
    {
        rezultat.miesiac = miesiac + 1;
        rezultat.dzien -= 30;
    }

    if (rezultat.miesiac > 12)
    {
        rezultat.rok = rok + 1;
        rezultat.miesiac = miesiac++ - 12;
    }

     return rezultat;
}

// deklaracja
void pokaz(Data ddd);

int main()
{
    Data data;

    data = data += 32;
    pokaz(data);

    return 0;
}

void pokaz(Data ddd)
{
    cout << "dzien " << ddd.dzien
        << " miesiac " << ddd.miesiac
        << " rok " << ddd.rok << endl;
}
0

Zamiast tych zmień te if na while(zawartość i warunek zostaw).
Po co przeciążać operator += skoro musisz i tak używać go w ten bezsensowny sposób: data = data += 32;? Zamiast na zmiennej lokalnej operuj w tym operatorze na this - wtedy będzie działał sensownie.

0

Przeanalizuj po kolei co się dzieje podczas wykonywania kodu. Popatrz. Załóżmy, że w zmiennej dzień jest 1, a Ty dodajesz 65. W rezultat.dzien masz razem 66. Wchodzimy do if, bo (rezultat.dzien>30). Zmieniamy miesiąc i odejmujemy 30 (btw to też jest trochę naciągane). Ile nam zostaje?

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