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.