Dzień dobry,
obecny problem wynikł z problemu opisanego tutaj: https://forum.pasja-informatyki.pl/574030/dziedziczony-singleton-dostepny-tylko-dla-klas
W skrócie:
Robiąc zadanie z odc. 3 z OOP w C++ od p. Zelenta, chciałem móc podstawić nazwę miesiąca za nr miesiąca i i wyliczyć jaki dzień tygodnia będzie w danej dacie. Potrzebowałem czegoś, co przechowa nazwy słowne dni tygodnia oraz miesięcy i spełnia następujące kryteria:
- jest niezmienne w swej postaci
- nie ma żadnych kopii, jest co najwyżej jeden egzemplarz danych
- jest dostępne dla wybranych klas
- służy tylko do odczytu
Po rozmowach doszedłem do wniosku, że najlepsza będzie funkcja zaprzyjaźniona przechowująca pola będące tablicami pożądanych wartości. Niestety, mając jedną klasę w jednym pliku i drugą klasę zaprzyjaźnioną w drugim i załączając je wzajemnie za pomocą include, dochodziło do błędów.
Zdecydowałem się stworzyć plik nagłówkowy ze stałymi tablicami - MonthsAndDays,h i załączyłem ją tylko do pliku Event.cpp. W końcu osiągnąłem 4/4 punkty.
To, co jednak dzieje się w głównej funkcji, jest nie do przyjęcia. Korzystając z funkcji show() dla obiektu event1 z domyślnymi parametrami, mam poprawne dane - sobota. Nadpisując te parametry funkcją load() i dając te same wartości, mam inny dzień - poniedziałek. A próba wyświetlenia dwóch zainicjalizowanych obiektów jeden po drugim powoduje błąd programu. Próbowałem to zrobić z opóźnieniem (Sleep), bo może dostęp do tych komórek nie był zwolniony (?), ale nie pomagało.
Proszę o pomoc.
main.cpp
#include "Event.h"
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
Event event1, event2;
event1.show();
//Sleep(10000);
//event2.show();
cout << endl;
event1.load();
cout << endl;
event1.show();
return 0;
}
Event.h
#ifndef EVENT_H
#define EVENT_H
#include "Event.h"
#include <iostream>
class Event
{
private:
std::string name;
std::string place;
unsigned short day, month, year;
unsigned short hour, minutes;
unsigned short weeks_day;
public:
Event(std::string="nazwa", std::string="miejsce", unsigned short=1, unsigned short=1,
unsigned short=2000, unsigned short=0, unsigned short=0);
~Event();
void load();
void show() const;
private:
void Zellers_congruity();
unsigned short Zellers_month() const;
unsigned short Zellers_century() const;
unsigned short Zellers_century_year() const;
};
#endif // EVENT_H
Event,cpp
#include "Event.h"
#include "MonthsAndDays.h"
using namespace std;
Event::Event(string name, string place, unsigned short day, unsigned short month, unsigned short year, unsigned short hour, unsigned short minutes)
{
this->name=name;
this->place=place;
this->day=day;
this->month=month;
this->year=year;
this->hour=hour;
this->minutes=minutes;
}
Event::~Event()
{
cout << endl << "Usuwanie obiektu." << endl;
}
void Event::load()
{
cout << "KREATOR WYDARZEN" << endl << endl;
cout << "Nazwa: ";
getline(cin, name);
cout << "Miejsce: ";
getline(cin, place);
cout << "Dzien miesiaca: ";
cin >> day;
cout << "Numer miesiaca: ";
cin >> month;
cout << "Rok: ";
cin >> year;
cout << "Godzina (sama godzina): ";
cin >> hour;
cout << "Minuty: ";
cin >> minutes;
Zellers_congruity();
}
void Event::show() const
{
cout << "Wydarzenie '" << name << "' odbedzie sie w miejscu '" << place << "' " << day << " " << monthToText[month] << " ";
cout << year << " roku" << " (" << dayOfWeekToText[weeks_day] << ") " << "o godzinie " << hour << ":" << minutes << "." << endl;
}
void Event::Zellers_congruity()
{
unsigned short J{Zellers_century()}, K{Zellers_century_year()};
weeks_day=(day + 13*(Zellers_month()+1)/5 + J/4 + 5*J + K + K/4)%7;
}
unsigned short Event::Zellers_month() const
{
if(month<3) return month+12;
return month;
}
unsigned short Event::Zellers_century() const
{
return year/100;
}
unsigned short Event::Zellers_century_year() const
{
return year%100;
}
MonthsAndDays.h
#ifndef MonthsAndDays_H
#define MonthsAndDays_H
#include <iostream>
const std::string monthToText[]
{
"",
"stycznia",
"lutego",
"marca",
"kwietnia",
"maja",
"czerwca",
"lipca",
"sierpnia",
"wrzesnia",
"pazdziernika",
"listopada",
"grudnia"
};
const std::string dayOfWeekToText[]
{
"sobota",
"niedziela",
"poniedzialek",
"wtorek",
"sroda",
"czwartek",
"piatek"
};
#endif // MonthsAndDays_H