• 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)

VPS Starter Arubacloud
0 głosów
523 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 648 wizyt
pytanie zadane 20 października 2021 w C i C++ przez MKolaj15 Bywalec (2,270 p.)
0 głosów
1 odpowiedź 635 wizyt
pytanie zadane 15 października 2018 w C i C++ przez air855 Nowicjusz (220 p.)
0 głosów
0 odpowiedzi 144 wizyt
pytanie zadane 15 sierpnia 2018 w C i C++ przez XezolPL Obywatel (1,530 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...