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

Przeładowanie opreratorów opreujących na czasie C++

Object Storage Arubacloud
0 głosów
241 wizyt
pytanie zadane 29 października 2021 w C i C++ przez MKolaj15 Bywalec (2,270 p.)
otwarte ponownie 30 października 2021 przez MKolaj15

Witam, jednym z moich zadań było stworzenie struktury opisującej czas, która będzie zawierała funkcje składowe takiej jak, zwiekszanie godzin, minut i sekund o 1, czy też wypisanie pory dnia zależnej od godziny. Teraz mam do tej struktury dodać dane funkcje umożliwiające arytmetykę na czasie:

auto operator + ( Time const &) const -> Time ;
auto operator - ( Time const &) const -> Time ; 
auto operator < ( Time const &) const -> bool ;
auto operator > ( Time const &) const -> bool ;
auto operator == ( Time const &) const -> bool ;
auto operator != ( Time const &) const -> bool ;

Mają one być zaimplementowane według podanego przykładu:

//plik naglowkowy

struct Modulo_ arithmetic {
int const mod { std :: numerical_limits < int >:: max () };
int value { 0 };
Modulo_arithmetic ( int v , int m ): mod { m } , value { v } {}
auto operator + ( Modulo _ arithmetic const ) const -> Modulo _ arithmetic ;
auto operator < ( Modulo _ arithmetic const ) const -> bool ;
};


//plik glowny

auto Modulo _arithmetic :: operator + ( Modulo _ arithmetic const o ) const
-> Modulo_ arithmetic
{
// FIXME what if the mods are different ?
return Modulo_ arithmetic {( value + o . value ) % mod , mod };
}
auto Modulo _arithmetic :: operator < ( Modulo _ arithmetic const o ) const
-> bool
{
return ( value < o . value );
}

Oto mój kod (plik nagłówkowy):

#include <iostream>
#include <string>

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

/* funkcje potrzebne do poprzednich zadań

    auto to_string() const -> std::string;
    auto next_hour() -> void;
    auto next_minute() -> void;
    auto next_second() -> void;                                                             
    enum class Time_of_day { Niezdefiniowany, Rano, Dzien, Wieczor, Noc };
    auto time_of_day() const -> Time_of_day;
    auto to_string(Time_of_day) -> std::string;
*/

    auto operator+ ( Time const ) const -> Time ; 
    auto operator- ( Time const ) const -> Time ;
    auto operator< ( Time const ) const -> bool ;
    auto operator> ( Time const ) const -> bool ;
    auto operator== ( Time const ) const -> bool ;
    auto operator!= ( Time const ) const -> bool ;


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

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}
{}

/* funkcje potrzebne do poprzednich zadań
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 >= 0) && (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;
    } else {
        return Time_of_day::Niezdefiniowany;
    }
}

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 if (t == Time_of_day::Noc) {
        return "Noc";
    } else {
        return "Niezdefiniowany";
    }
}

*/

auto :: Time :: operator+ (Time const o) const -> Time
{
return Time (godzina + o.godzina);
}


auto main() -> int
{
    auto czas  = Time(23, 59, 59);
    auto czas2 = Time(10, 46, 1);
    std::cout << czas.to_string() << std::endl;
    std::cout << czas.to_string(czas.time_of_day()) << std::endl;
    czas.next_minute();
    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;

    std::cout << czas2.to_string() << std::endl;
    std::cout << czas2.to_string(czas2.time_of_day()) << std::endl;


    return 0;
}

Mam w sumie 3 problemy:

1. Po skompilowaniu programu, wyświetla się błąd: "error: no matching function for call to ‘Time::Time(int)’
 return Time (godzina + o.godzina);"

2. Jak zdefniować te funkcje, aby możliwe były operacje na całym czasie, a nie tylko na godzinie, jak początkowo chciałem to zrobić?

3. Jak wywołać taką funkcję w mainie?

Mam nadzieję, że to co napisałem jest w miarę przejrzyste. Z góry dziękuję za pomoc!

1 odpowiedź

+2 głosów
odpowiedź 29 października 2021 przez TOM_CPP Pasjonat (22,640 p.)
wybrane 30 października 2021 przez MKolaj15
 
Najlepsza

Brakuje konstruktora w klasie Time, który przyjmował by tylko jeden argument, stąd wywołanie

Time(godzina + o.godzina)

jest sygnalizowane jako błąd.

Jednakże takie wywołanie nie ma sensu, gdyż nie są wtedy dodawane minuty i sekundy. Zamień na

return Time(godzina + o.godzina,minuta + o.minuta, sekunda + o.sekunda);

 

komentarz 29 października 2021 przez MKolaj15 Bywalec (2,270 p.)
Dzięki wielkie za pomoc, a wiesz może jak teraz taką funkcję wywołać w mainie, np. jeśli chciałbym dodać do siebie obiekty "czas" i "czas2", które tam są?
komentarz 30 października 2021 przez j23 Mędrzec (194,920 p.)
std::cout << (czas + czas2).to_string() << '\n';  

 

komentarz 30 października 2021 przez MKolaj15 Bywalec (2,270 p.)
Dziękii
1
komentarz 30 października 2021 przez j23 Mędrzec (194,920 p.)
Jeszcze zwróć uwagę na to, że według założeń zadania parametry operatorów powinny być przekazywane przez referencje. Teraz przekazujesz przez wartość.
komentarz 30 października 2021 przez MKolaj15 Bywalec (2,270 p.)
Czyli wystarczy, że po const do każdej funkcji powstawiam wskaźniki "&"?
1
komentarz 30 października 2021 przez j23 Mędrzec (194,920 p.)
Tak.
komentarz 31 października 2021 przez MKolaj15 Bywalec (2,270 p.)

@TOM_CPP,    Okej, mam kolejny problem, chodzi o defnicje operatorów: <, >, ==, !=

U mnie wygląda ona tak:

auto :: Time :: operator> (Time const& o) const -> bool
{
return (godzina > o.godzina, minuta > o.minuta, sekunda > o.sekunda);
}

auto :: Time :: operator< (Time const& o) const -> bool
{
return (godzina < o.godzina, minuta < o.minuta, sekunda < o.sekunda);
}

auto :: Time :: operator== (Time const& o) const -> bool
{
return (godzina == o.godzina, minuta == o.minuta, sekunda == o.sekunda);
}

auto :: Time :: operator!= (Time const& o) const -> bool
{
return (godzina != o.godzina, minuta != o.minuta, sekunda != o.sekunda);
}

I domyślam się, że nie jest to poprawny sposób, chociażby dlatego, że pojawia się taki błąd: " error: left operand of comma operator has no effect [-Werror=unused-value]
 return (godzina > o.godzina, minuta > o.minuta, sekunda > o.sekunda)"

Czy moglibyście mi pomóc z definiowaniem tych funkcji?

1
komentarz 1 listopada 2021 przez TOM_CPP Pasjonat (22,640 p.)
edycja 1 listopada 2021 przez TOM_CPP

Używaj operatorów logicznych && , || zamiast operatora comma ( przecinek ).

bool Time::operator==( Time const& o ) const
{
     return godzina == o.godzina && minuta == o.minuta && sekunda == o.sekunda;
}

W przypadku nierówności możesz użyć struktury std::tuple.

#include <tuple>
....
bool Time::operator<( Time const& time ) const
{
    return make_tuple(godzina,minuta,sekunda)<make_tuple(time.godzina,time.minuta,time.sekunda);
}

 

komentarz 1 listopada 2021 przez MKolaj15 Bywalec (2,270 p.)
Dzięki wielkie, a mógłbyś mi jeszcze w skrócie wyjaśnić co daje użycie struktury std::tuple, bo czytając o tym w internecie nie do końca zrozumiałem na czym ona polega?

Podobne pytania

0 głosów
1 odpowiedź 1,171 wizyt
pytanie zadane 18 marca 2017 w C i C++ przez Milesq Nałogowiec (32,020 p.)
+1 głos
2 odpowiedzi 347 wizyt
pytanie zadane 11 sierpnia 2017 w C i C++ przez Artur Koniec Gaduła (3,670 p.)
0 głosów
1 odpowiedź 270 wizyt
pytanie zadane 22 października 2022 w JavaScript przez chrystian Gaduła (4,780 p.)

92,572 zapytań

141,422 odpowiedzi

319,645 komentarzy

61,959 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!

...