#include <iostream>
#include <string>
using namespace std;
class Tank {
private:
int maximalstand;
int fuellstand;
public:
Tank(int maximalstand) : maximalstand(maximalstand), fuellstand(maximalstand) {}
void volltanken() {
fuellstand=maximalstand;
}
void verbrauchen(int liter) {
fuellstand-=liter;
if(fuellstand < 0) {
fuellstand=0;
throw "Der Tank ist leer";
}
}
};
template<typename Config>
class TankProvider : public Config {
public:
TankProvider(int liter) : Config(liter) {}
};
template<typename Next>
class TankProviderVolltanken : public Next {
public:
TankProviderVolltanken(int liter) : Next(liter) {}
void volltanken() {
this->getTank().volltanken();
}
};
template<typename Next>
class TankProviderVerbrauchen : public Next {
public:
TankProviderVerbrauchen(int liter) : Next(liter) {}
void verbrauchen(int liter) {
this->getTank().verbrauchen(liter);
}
};
template<typename Tank>
class TankProviderBase {
private:
Tank impl;
protected:
Tank& getTank() {
return impl;
}
Tank const& getTank() const {
return impl;
}
TankProviderBase(int maximalstand) : impl(maximalstand) {}
};
class Auto : public TankProvider<TankProviderVolltanken<TankProviderBase<Tank> > > {
private:
public:
Auto() : TankProvider(75) { }
void fahren(int km) {
//pro 10km 1 liter
int verbrauch = km/10;
getTank().verbrauchen(verbrauch);
}
};
int main() {
Auto merzedes;
merzedes.volltanken();
try {
while(1) {
merzedes.fahren(10);
}
} catch(...) {
cout<<"Tank leer\n";
}
}