przeciążenie opereratora +=

2011-09-30 10:18
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

edytowany 1x, ostatnio: TAXIarz, 2011-09-30 10:19

Pozostało 580 znaków

2011-09-30 10:32
pan kuba
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?

Pozostało 580 znaków

2011-09-30 10:34
0

data +=5;


░█░█░█░█░█░█░█░█░█░█░█░

Pozostało 580 znaków

2011-09-30 10:34
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 :)

Fakt. Klasę należy poprawić. - TAXIarz 2011-09-30 10:47

Pozostało 580 znaków

2011-09-30 10:39
0

poza tym

Data::operator+=

moim zdaniem nie powinien nic zwracać.

Pozostało 580 znaków

2011-09-30 10:44
0

Poprawiłem tak:


...
int main()
{
    Data data;

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

    return 0;
}
...
edytowany 2x, ostatnio: TAXIarz, 2011-09-30 10:46
powinno być data+=5 To co zrobiłeś używa += dla typu int, a nie twojego przeciążonego - trocha 2011-09-30 13:09

Pozostało 580 znaków

2011-09-30 10:48
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

Pozostało 580 znaków

2011-10-01 13:34
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;
}

Pozostało 580 znaków

2011-10-01 13:37
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.


Pozostało 580 znaków

2011-10-01 14:05
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?

Pozostało 580 znaków

2011-10-03 12:09
0

Musisz uwzględnić jeszcze liczbę dni danego miesiąca i czy nie jest to rok przestępny na dodatek (luty!). Czyli podsumowując:

  1. Zmień ify na while
  2. Zamiast rezultat użyj this
  3. Zwracany typ zmień na void
  4. Weź pod uwagę liczbę dni danego miesiąca

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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