• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Struktura opisująca czas (porę dnia)

Object Storage Arubacloud
0 głosów
556 wizyt
pytanie zadane 26 października 2021 w C i C++ przez MKolaj15 Bywalec (2,270 p.)
zamknięte 26 października 2021 przez MKolaj15

Witam, miałem za zadanie stworzenie struktury opisującej czas, która miała składać się z pól godzina, minuta, sekunda oraz funkcji składowych oddzielnie zwiększających każde pole o 1, plus funkcji składowej wyświetlającej czas w formacie HH:MM:SS. Teraz mam następujące zadanie:

Do struktury opisującej czas dodać funkcję składową ‘time_of_day() const’ zwracającą
porę dnia (rano, dzień, wieczór, noc). Pora dnia powinna być opisana typem
wyliczeniowym enum class Time_of_day.
Napisać funkcję to_string(Time_of_day) zwracającą std::string, która zamieni
wartość wyliczeniową na napis.
W funkcji main dodać kod pozwalający na zweryfikowanie działania dodanych funkcji.
Kod źródłowy w plikach include/s1234/Time.h (nagłówek) i src/s03-Time.cpp (implementacja i funkcja
main).

Tak wygląda mój plik nagłówkowy:

#include <iostream>
#include <string>

struct Time {
    int godzina;
    int minuta;
    int sekunda;

    auto to_string() const -> std::string; // funkcja zwracająca godzinę w podanym formacie
    auto next_hour() -> void;
    auto next_minute() -> void;
    auto next_second() -> void;
   
    enum class Time_of_day 
    { 
     Rano,
     Dzien,
     Wieczor,
     Noc
    };

    auto time_of_day() const -> Time_of_day;
    auto to_string(Time_of_day) -> std::string;

    Time(int godzina, int minuta, int sekunda);
};

A tak plik główny:

#include <s25441/Time.h>

#include <iomanip>
#include <iostream>
#include <string>

Time::Time(int godz, int min, int sek)
        : godzina{godz}, minuta{min}, sekunda{sek}
{}

auto ::Time::next_hour() -> void
{
    if (godzina < 23) {
        godzina++;
    } else {
        godzina = 0;
    }
}

auto ::Time::next_minute() -> void
{
    if (minuta < 59) {
        minuta++;
    } else {
        next_hour();
        minuta = 0;
    }
}

auto ::Time::next_second() -> void
{
    if (sekunda < 59) {
        sekunda++;
    } else {
        next_minute();
        sekunda = 0;
    }
}


auto ::Time::to_string() const -> std::string
{
    std::string godz = std::to_string(godzina);
    std::string min  = std::to_string(minuta);
    std::string sek  = std::to_string(sekunda);

    if (godzina < 10) {
        godz = "0" + godz;
    }

    if (minuta < 10) {
        min = "0" + min;
    }

    if (sekunda < 10) {
        sek = "0" + sek;
    }


    return godz + ":" + min + ":" + sek;
}


auto::Time::time_of_day() const -> Time_of_day
{
    if ((godzina >= 23) && (godzina <= 5)) {
        return Time_of_day::Noc;
    } else if ((godzina >= 6) && (godzina <= 10)) {
        return Time_of_day::Rano;
    } else if ((godzina >= 11) && (godzina <= 16)) {
        return Time_of_day:: Dzien;
    } else if ((godzina >= 17) && (godzina <= 22)) {
        return Time_of_day::Wieczor;
    }
}

auto::Time::to_string(Time_of_day t) -> std::string
{
    if (t ==Time_of_day:: Rano) {
       return "Rano";
    }
    else if(t ==Time_of_day:: Dzien){
        return "Dzien";
    }
    else if(t ==Time_of_day:: Wieczor){
        return "Wieczor";
    }
    else{
        return "Noc";
    }
}

auto main() -> int
{
    auto czas = Time(23, 59, 59);
   
    std::cout << czas.to_string() << std::endl;
    czas.next_minute();
    
    std::cout<<czas.to_string(Time_of_day)<<std::endl;
    
    std::cout << czas.to_string() << std::endl;
    czas.next_second();
    std::cout << czas.to_string() << std::endl;
    czas.next_hour();
    std::cout << czas.to_string() << std::endl;
    return 0;
}

Poprzednie zdanie działa poprawnie. Problem mam z wywłaniem funkcji to_string(TIme_of_day) w funkcji main, ponieważ wyświetla mi błąd, że "‘Time_of_day’ was not declared in this scope", co jest zrozumiałe, bo enum class znajduje się w pliku nagłówkowym, ale przecież musi tam być, aby zadeklarować funkcję time_of_day() zwracającą Time_of_day. Czy ktoś byłby w stanie pomóc mi rozwiązać ten problem? Z góry dziękuję!

komentarz zamknięcia: uzyskałem odpowiedź

1 odpowiedź

+2 głosów
odpowiedź 26 października 2021 przez draghan VIP (106,230 p.)
wybrane 26 października 2021 przez MKolaj15
 
Najlepsza

Masz tutaj dwa problemy.

1. `Time_of_day` jest zadeklarowane wewnątrz klasy `Time`, więc jeśli chcesz się do niej odwołać spoza klasy, potrzebujesz explicite to wyrazić:

std::cout<<czas.to_string(Time::Time_of_day)<<std::endl;

2. Ale tak naprawdę nie musisz tego robić. Powyższy kod również nie zadziała, bo `Time::Time_of_day` to nazwa typu, a Ty chcesz do metody `Time::to_string(Time_of_day)` podać określoną wartość danego typu. Musisz więc np. przekazać tam zmienną, do której wcześniej przypiszesz jakąś wartość enumeracji:

auto time_of_day = czas.time_of_day();
std::cout<<czas.to_string(time_of_day)<<std::endl;

(albo bez posiłkowania się zmienną: `std::cout<<czas.to_string(czas.time_of_day())<<std::endl;`)

komentarz 26 października 2021 przez MKolaj15 Bywalec (2,270 p.)
Cześć, dzięki wielkie za pomoc, zrozumiałem o co chodzi, lecz pojawia się kolejny problem, który nie do końca rozumiem, mianowicie po wporwadzeniu tych zmian wywala taki błąd:

"src/s03-Time.cpp: In member function ‘Time::Time_of_day Time::time_of_day() const’:
src/s03-Time.cpp:75:1: error: control reaches end of non-void function [-Werror=return-type]"
komentarz 26 października 2021 przez draghan VIP (106,230 p.)

Kompilator patrzy na Twoją funkcję i widzi, że ma zwracać `Time::Time_of_day`.

Potem patrzy na ciało Twojej funkcji i widzi, że istnieje hipotetyczna możliwość, że Twoje warunki nie pokryją wszystkich watości typu int, który wykorzystujesz do przechowywania aktualnej godziny.

W takim wypadku, punkt wykonania programu wyjdzie poza ostatni else i... właśnie. I co wtedy? Funkcja miała zwracać `Time::Time_of_day` a znaleźliśmy się w miejscu bez żadnego returna. To właśnie mówi komunikat błędu.

Jest kilka sposobów na który możemy obsłużyć tę sytuację.

Możesz dodać `return Time_of_day::Noc;` na samym końcu funkcji, żeby załatać tę lukę. Nie jest to najlepsze rozwiązanie, bo zwracasz wartość `Noc` która jest zarezerwowana dla określonych wartości godziny w przypadku, w którym nie powinieneś.

Możesz przemodelować odrobinę swój łańcuch `if else if` tak, żeby ostatni `else` był bez części `if` - resztę rozsądnych wartości masz przecież pokrytą poprzednimi warunkami, ale tutaj znów mamy taki sam problem jak poprzednio: "a jeśli godzina będzie spoza oczekiwanego zakresu, to znów zwrócimy wartość która nie powinna być przypisana do danej godziny".

Możesz też wprowadzić kolejną wartość do enuma Time_of_day, np.

    enum class Time_of_day 
    { 
     Niezdefiniowany,
     Rano,
     Dzien,
     Wieczor,
     Noc
    };

i zwracać ją właśnie w takich przypadkach.

komentarz 26 października 2021 przez Oscar Nałogowiec (29,290 p.)
Skoro działamy w C++ to w sytuacjach błednych można też wywalić wyjątek. Ale może jeszcze tego nie było.
komentarz 26 października 2021 przez MKolaj15 Bywalec (2,270 p.)

@draghan, Dzięki za pomoc, użyłem tego ostatniego sposobu, dodałem kolejną wartość do enuma i zwracam go w else. Dzięki!

Podobne pytania

0 głosów
0 odpowiedzi 678 wizyt
pytanie zadane 20 października 2021 w C i C++ przez MKolaj15 Bywalec (2,270 p.)
0 głosów
1 odpowiedź 639 wizyt
pytanie zadane 15 października 2018 w C i C++ przez air855 Nowicjusz (220 p.)
0 głosów
0 odpowiedzi 145 wizyt
pytanie zadane 15 sierpnia 2018 w C i C++ przez XezolPL Obywatel (1,530 p.)

92,551 zapytań

141,400 odpowiedzi

319,531 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...