Funkcje i zmienne składowe – sugestie co do poprawy kodu

0

Witam,
poniższy kod działa tak jak powinien ale zastanawiam się czy nie lepiej by było, aby funkcja year() z klasy Date zwracała typ Year zamiast int.
Jeśli byłoby to lepsze rozwiązanie to może ktoś podpowiedzieć jak to zrobić? Problem sprawia mi operator << którym próbuję tą składową wyświetlić gdy funkcja Date::year zwraca Year.

class Year {
    static const int min = 1800;
	static const int max = 2200;
	int y;
public:
	class Invalid { };
	Year(int y);
	int year() const { return y; }
};

Year::Year(int y)
	: y(y)
{
	if (y < min || y > max) throw Invalid();
}

class Date {
public:
	class Invalid { };
	enum Month {
		jan=1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec
	};
	Date(Year y, Month m, int d);
	void add_day(int n);
	Month month() const { return m; }
	int day() const { return d; }
	int year() const { return y.year(); }
private:
	Year y;
	Month m;
	int d;
	bool check();
};

Date::Date(Year y, Month m, int d)
	: y(y), m(m), d(d)
{
	if (!check()) throw Invalid();
}

bool Date::check()
{
	if (m < 1 || m > 12 || d < 1 || d > 31) return false;
	return true;
}

void Date::add_day(int n)
{
	d += n;
}

ostream& operator<<(ostream& os, const Date& dd)
{
	return os << '(' << dd.year()
		<< ',' << dd.month()
		<< ',' << dd.day() << ')';
}

int main()
try {
	Date today(1978, Date::jul, 20);
	Date tomorrow = today;
	tomorrow.add_day(1);
	cout << today << endl;
	cout << tomorrow << endl;
}
catch (Date::Invalid) {
	cout << "Niepoprawna data\n";
	return 1;
}
0

return os << '(' << dd.year() próbujesz tutaj wypisać obiekt klasy Year. Skąd kompilator ma wiedzieć co robić, skoro takiego "operatora wypisania" nie zaimplementowałeś dla tej klasy?

0

Wystarczy że dodam ten kod przed wcześniejszą definicją tego operatora?

ostream& operator<<(ostream& os, const Year& yy)
{
        return os << yy.year();
}
0

No tak, właśnie tego Ci brakuje.

0

Holy moly próbowałem tego wcześniej ale nie pomyślałem o tym żeby dodać to przed definicją << dla typu Date
Dzięki za pomoc :)

0

Po co Ci klasa Year?
Jakie są zalety utworzenia i trzymania takiej klasy nad zwracaniem unsigned inta?

0

Jest to kod z książki z której się uczę, autor wspomniał że w tym przypadku klasa Year nie jest potrzebna ale mimo to chciałem zobaczyć jak to działa.

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