fork download
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. class Tank {
  7. private:
  8. int maximalstand;
  9. int fuellstand;
  10.  
  11. public:
  12. Tank(int maximalstand) : maximalstand(maximalstand), fuellstand(maximalstand) {}
  13.  
  14. void volltanken() {
  15. fuellstand=maximalstand;
  16. }
  17.  
  18. void verbrauchen(int liter) {
  19. fuellstand-=liter;
  20. if(fuellstand < 0) {
  21. fuellstand=0;
  22. throw "Der Tank ist leer";
  23. }
  24. }
  25. };
  26.  
  27. template<typename Config>
  28. class TankProvider : public Config {
  29. public:
  30. TankProvider(int liter) : Config(liter) {}
  31. };
  32.  
  33. template<typename Next>
  34. class TankProviderVolltanken : public Next {
  35. public:
  36. TankProviderVolltanken(int liter) : Next(liter) {}
  37. void volltanken() {
  38. this->getTank().volltanken();
  39. }
  40. };
  41.  
  42. template<typename Next>
  43. class TankProviderVerbrauchen : public Next {
  44. public:
  45. TankProviderVerbrauchen(int liter) : Next(liter) {}
  46.  
  47. void verbrauchen(int liter) {
  48. this->getTank().verbrauchen(liter);
  49. }
  50. };
  51.  
  52.  
  53. template<typename Tank>
  54. class TankProviderBase {
  55. private:
  56. Tank impl;
  57. protected:
  58. Tank& getTank() {
  59. return impl;
  60. }
  61.  
  62. Tank const& getTank() const {
  63. return impl;
  64. }
  65.  
  66. TankProviderBase(int maximalstand) : impl(maximalstand) {}
  67. };
  68.  
  69. class Auto : public TankProvider<TankProviderVolltanken<TankProviderBase<Tank> > > {
  70. private:
  71.  
  72. public:
  73.  
  74. Auto() : TankProvider(75) { }
  75.  
  76. void fahren(int km) {
  77. //pro 10km 1 liter
  78. int verbrauch = km/10;
  79. getTank().verbrauchen(verbrauch);
  80. }
  81. };
  82.  
  83. int main() {
  84. Auto merzedes;
  85.  
  86. merzedes.volltanken();
  87. try {
  88. while(1) {
  89. merzedes.fahren(10);
  90. }
  91. } catch(...) {
  92. cout<<"Tank leer\n";
  93. }
  94. }
Success #stdin #stdout 0s 2984KB
stdin
Standard input is empty
stdout
Tank leer