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

Jak przerobić pętle na bardziej czytelną

Object Storage Arubacloud
0 głosów
98 wizyt
pytanie zadane 24 lipca 2020 w C i C++ przez nelumbo Nowicjusz (120 p.)

Mam taką funkcję która symuluje poruszanie się samochodu (odlicza litry paliwa z baku od aktualnego stanu i dodaje przejechane kilometry na podstawie przebytego dystansu):
 

template < class T1, class T2>
bool jedz_globalna(T1& obj, T2 wspolczynnik, int dystans) {

double potrzebne_paliwo = dystans * wspolczynnik * ((double)obj.pojemnosc_silnika / (double)1000);
if (obj.paliwo >= potrzebne_paliwo) {
    cout << obj.model << " przejechal " << dystans << " km" << endl;
    obj.paliwo -= potrzebne_paliwo;
    obj.przebieg += dystans;
    return true;
}
cout << obj.model << " nie moze przejechac danego dystansu" << endl;
return false;

}

 

Muszę przygotować std::vector (vector<pojazd>…) i dodać do niego Samochod i Motor a następnie w pętli wywołać dla elementów tego wektora metodę jedz() dla odcinków 2km.
Pętla powinna się wykonywać do momentu gdy żaden pojazd nie będzie już wstanie dalej jechać (czyli metoda jedz() dla każdego z nich zwróci false ). Udało mi się zrobić takie coś:

void test() {

vector<Pojazd*> v;
Samochod *a1 = new Samochod;
Motor *b1 = new Motor;

v.push_back(a1);
v.push_back(b1);

int dystans = 2;

while (true) {
    if (v[0]->jedz(dystans) == false && v[1]->jedz(dystans) == false) {
        cout << "Skonczylo sie paliwo :)" << endl; break;
    }
    else {
        for (auto it : v) {
            it->jedz(dystans);
        }
    }
}

}

Pętla teoretycznie działa, ale kod jest nieczytelny. Zastanawiam się jak zrobić to bardziej czytelnie, bo jeśli w vectorze będzie np 10 pojazdów to co wtedy? Poza tym użyłem wskaźnika, a docelowo nie powinien to być wskaźnik. Jednak jeśli użyje vector<pojazd> v; wtedy jest wywoływana funkcja jedz() z klasy bazowej czyli z klasy Pojazd a nie z klas pochodnych Samochod i Motor. Coś robię źle w takim razie. Będę wdzięczny za pomoc.

 

komentarz 24 lipca 2020 przez Wiciorny Ekspert (270,190 p.)
zmienić po pierwsze na język angielski i  posługiwać się pragmatycznymi nazwami
metody- czasowniki , określanie co robi/zwraca działanie metody
zmienne - przymiotniki, określanie co przechowują
1
komentarz 25 lipca 2020 przez j23 Mędrzec (194,920 p.)

@nelumbo,

Jednak jeśli użyje vector<pojazd> v; wtedy jest wywoływana funkcja jedz() z klasy bazowej czyli z klasy Pojazd a nie z klas pochodnych Samochod i Motor.

A dlaczego miałaby być wywoływana metoda innej klasy, skoro w wektorze są obiekty klasy Pojazd? Przy polimorfizmie nie unikniesz wskaźników.

1 odpowiedź

0 głosów
odpowiedź 24 lipca 2020 przez tangarr Mędrzec (154,860 p.)

Przeiteruj po wszystkich pojazdach w wektorze i przerwij zewnętrzną pętlę jeżeli żaden pojazd nie mógł przejechać zadanego odcinka.
 

while (true) {
    bool brak_paliwa = true;
    for (auto &pojazd : v) {
        if (pojazd->jedz(dystans)
            brak_paliwa = false;
    }
    if (brak_paliwa)
        cout << "Skonczylo sie paliwo :)" << endl; 
        break;
    }
}

 

Podobne pytania

0 głosów
2 odpowiedzi 445 wizyt
pytanie zadane 24 września 2017 w PHP przez Raster22 Obywatel (1,640 p.)
+1 głos
1 odpowiedź 1,107 wizyt
0 głosów
1 odpowiedź 297 wizyt
pytanie zadane 10 lutego 2017 w C i C++ przez Phantom Nowicjusz (120 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

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

...