fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <sstream>
  4. #include <string>
  5.  
  6. using namespace std;
  7.  
  8.  
  9. class P {
  10. private:
  11. string name;
  12.  
  13. public:
  14. P(string n) : name(n) {}
  15.  
  16. virtual string toString() const {
  17. return "P_" + name + "\n";
  18. }
  19.  
  20. virtual P * anpassen(int anzahl) {
  21. return this;
  22. }
  23.  
  24. };
  25.  
  26.  
  27.  
  28. class I {
  29. public:
  30. I(const P & p_, int a) : p(p_), amount(a) {
  31. }
  32.  
  33. string desc(int factor) const {
  34. string s;
  35.  
  36. s += " " + to_string( factor * amount ) + " * ";
  37. s += " I_";
  38. // call P::toString or Moebel::toString() ?
  39. s += p.toString();
  40.  
  41. return s;
  42. }
  43.  
  44. private:
  45. const P & p;
  46. int amount;
  47.  
  48. };
  49.  
  50.  
  51. class Bauteile {
  52.  
  53. private:
  54. vector<I> teile;
  55. string name;
  56. unsigned int anzahl_;
  57.  
  58.  
  59. public:
  60. Bauteile(string n, int anzahl=1) : name(n), anzahl_(anzahl) {
  61. }
  62.  
  63. void add(const P & p, int amount) {
  64. I i(p, amount);
  65. teile.push_back(i);
  66. }
  67.  
  68. void setAnzahl(int n) {
  69. anzahl_ = n;
  70. }
  71.  
  72. string toString() const {
  73. string s;
  74. s += to_string( anzahl_) + "\n";
  75. for (auto i : teile) {
  76. s += " ";
  77. s += i.desc( anzahl_ ) + "\n";
  78. }
  79. return s;
  80. }
  81.  
  82.  
  83. };
  84.  
  85.  
  86. class Moebel : public P {
  87.  
  88. private:
  89. Bauteile bauteile;
  90.  
  91.  
  92. public:
  93.  
  94. Moebel(string n) : P(n), bauteile(n) {
  95. }
  96.  
  97. string toString() const {
  98. string s;
  99. s += "Moebel ";
  100. s += P::toString();
  101. s += bauteile.toString();
  102.  
  103. return s;
  104. }
  105.  
  106. void addToBauteile(const P & p, int anzahl) {
  107. bauteile.add(p, anzahl);
  108. anpassen(anzahl);
  109. }
  110.  
  111. Moebel * anpassen(int anzahl) {
  112. // cout << "Moebel_adapt" << endl;
  113. this->bauteile.setAnzahl(anzahl);
  114. return this;
  115. }
  116.  
  117.  
  118. };
  119.  
  120. int main() {
  121.  
  122. // Bauteile
  123. P p1("schrauben");
  124. P p2("brett");
  125.  
  126. Moebel regal("Regal");
  127. regal.addToBauteile(p1, 1);
  128. regal.addToBauteile(p2, 4);
  129.  
  130. cout << regal.toString() << endl;
  131.  
  132. P p3("holztuer");
  133. Moebel grosses_regal("Grosses_regal");
  134. grosses_regal.addToBauteile(p3, 2);
  135. grosses_regal.addToBauteile(regal, 2);
  136.  
  137. cout << grosses_regal.toString() << endl;
  138.  
  139.  
  140. return 0;
  141.  
  142. }
  143.  
Success #stdin #stdout 0s 15248KB
stdin
Standard input is empty
stdout
Moebel P_Regal
4
   4 *  I_P_schrauben

   16 *  I_P_brett


Moebel P_Grosses_regal
2
   4 *  I_P_holztuer

   4 *  I_Moebel P_Regal
4
   4 *  I_P_schrauben

   16 *  I_P_brett