#include <iostream>
#include <vector>
#include <sstream>
#include <string>
using namespace std;
class P {
private:
string name;
public:
P(string n) : name(n) {}
virtual string toString() const {
return "P_" + name + "\n";
}
virtual P * anpassen(int anzahl) {
return this;
}
};
class I {
public:
I(const P & p_, int a) : p(p_), amount(a) {
}
string desc() const {
string s;
s += " " + to_string( amount ) + " * ";
s += " I_";
// call P::toString or Moebel::toString() ?
s += p.toString();
return s;
}
private:
const P & p;
int amount;
};
class Bauteile {
private:
vector<I> teile;
string name;
unsigned int anzahl_;
public:
Bauteile(string n, int anzahl=1) : name(n), anzahl_(anzahl) {
}
void add(const P & p, int amount) {
I i(p, amount);
teile.push_back(i);
}
void setAnzahl(int n) {
anzahl_ = n;
}
string toString() const {
string s;
s += to_string( anzahl_) + "\n";
for (auto i : teile) {
s += " ";
s += i.desc() + "\n";
}
return s;
}
};
class Moebel : public P {
private:
Bauteile bauteile;
public:
Moebel(string n) : P(n), bauteile(n) {
}
string toString() const {
string s;
s += "Moebel ";
s += P::toString();
s += bauteile.toString();
return s;
}
void addToBauteile(const P & p, int anzahl) {
bauteile.add(p, anzahl);
anpassen(anzahl);
}
Moebel * anpassen(int anzahl) {
// cout << "Moebel_adapt" << endl;
this->bauteile.setAnzahl(anzahl);
return this;
}
};
int main() {
// Bauteile
P p1("schrauben");
P p2("brett");
Moebel regal("Regal");
regal.addToBauteile(p1, 1);
regal.addToBauteile(p2, 4);
cout << regal.toString() << endl;
P p3("holztuer");
Moebel grosses_regal("Grosses_regal");
grosses_regal.addToBauteile(p3, 2);
grosses_regal.addToBauteile(regal, 2);
cout << grosses_regal.toString() << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgoKY2xhc3MgUCB7CnByaXZhdGU6CglzdHJpbmcgbmFtZTsKCnB1YmxpYzoKCVAoc3RyaW5nIG4pIDogbmFtZShuKSB7fQoKCXZpcnR1YWwgc3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgewoJCXJldHVybiAiUF8iICsgbmFtZSArICJcbiI7Cgl9CgoJdmlydHVhbCBQICogYW5wYXNzZW4oaW50IGFuemFobCkgewoJCXJldHVybiB0aGlzOwoJfQoKfTsKCgoKY2xhc3MgSSB7CnB1YmxpYzoKCUkoY29uc3QgUCAmIHBfLCBpbnQgYSkgOiBwKHBfKSwgYW1vdW50KGEpIHsKCX0KCglzdHJpbmcgZGVzYygpIGNvbnN0IHsKCQlzdHJpbmcgczsKCgkJcyArPSAiICIgKyB0b19zdHJpbmcoIGFtb3VudCApICsgIiAqICI7CgkJcyArPSAiIElfIjsKCQkvLyBjYWxsIFA6OnRvU3RyaW5nIG9yIE1vZWJlbDo6dG9TdHJpbmcoKSA/CgkJcyArPSBwLnRvU3RyaW5nKCk7CgoJCXJldHVybiBzOwoJfQoKcHJpdmF0ZToKCWNvbnN0IFAgJiBwOwoJaW50IGFtb3VudDsKCn07CgoKY2xhc3MgQmF1dGVpbGUgewoKcHJpdmF0ZToKCXZlY3RvcjxJPiB0ZWlsZTsKCXN0cmluZyBuYW1lOwoJdW5zaWduZWQgaW50IGFuemFobF87CgoKcHVibGljOgoJQmF1dGVpbGUoc3RyaW5nIG4sIGludCBhbnphaGw9MSkgOiBuYW1lKG4pLCBhbnphaGxfKGFuemFobCkgewoJfQoKCXZvaWQgYWRkKGNvbnN0IFAgJiBwLCBpbnQgYW1vdW50KSB7CgkJSSBpKHAsIGFtb3VudCk7CgkJdGVpbGUucHVzaF9iYWNrKGkpOwoJfQoKCXZvaWQgc2V0QW56YWhsKGludCBuKSB7CgkJYW56YWhsXyA9IG47Cgl9CgoJc3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgewoJCXN0cmluZyBzOwoJCXMgKz0gdG9fc3RyaW5nKCBhbnphaGxfKSAgKyAiXG4iOwoJCWZvciAoYXV0byBpIDogdGVpbGUpIHsKCQkJcyArPSAiICAiOwoJCQlzICs9IGkuZGVzYygpICsgIlxuIjsKCQl9CgkJcmV0dXJuIHM7Cgl9CgoKfTsKCgpjbGFzcyBNb2ViZWwgOiBwdWJsaWMgUCB7Cgpwcml2YXRlOgoJQmF1dGVpbGUgYmF1dGVpbGU7CgoKcHVibGljOgoKCU1vZWJlbChzdHJpbmcgbikgOiBQKG4pLCBiYXV0ZWlsZShuKSB7Cgl9CgoJc3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgewoJCXN0cmluZyBzOwoJCXMgKz0gIk1vZWJlbCAiOwoJCXMgKz0gUDo6dG9TdHJpbmcoKTsKCQlzICs9IGJhdXRlaWxlLnRvU3RyaW5nKCk7CgoJCXJldHVybiBzOwoJfQoKCXZvaWQgYWRkVG9CYXV0ZWlsZShjb25zdCBQICYgcCwgaW50IGFuemFobCkgewoJCWJhdXRlaWxlLmFkZChwLCBhbnphaGwpOwoJCWFucGFzc2VuKGFuemFobCk7Cgl9CgoJTW9lYmVsICogYW5wYXNzZW4oaW50IGFuemFobCkgewoJCS8vIGNvdXQgPDwgIk1vZWJlbF9hZGFwdCIgPDwgZW5kbDsKCQl0aGlzLT5iYXV0ZWlsZS5zZXRBbnphaGwoYW56YWhsKTsKCQlyZXR1cm4gdGhpczsKCX0KCgp9OwoKaW50IG1haW4oKSB7CgoJLy8gQmF1dGVpbGUKCVAgcDEoInNjaHJhdWJlbiIpOwoJUCBwMigiYnJldHQiKTsKCglNb2ViZWwgcmVnYWwoIlJlZ2FsIik7CglyZWdhbC5hZGRUb0JhdXRlaWxlKHAxLCAxKTsKCXJlZ2FsLmFkZFRvQmF1dGVpbGUocDIsIDQpOwoKCWNvdXQgPDwgcmVnYWwudG9TdHJpbmcoKSA8PCBlbmRsOwoKCVAgcDMoImhvbHp0dWVyIik7CglNb2ViZWwgZ3Jvc3Nlc19yZWdhbCgiR3Jvc3Nlc19yZWdhbCIpOwoJZ3Jvc3Nlc19yZWdhbC5hZGRUb0JhdXRlaWxlKHAzLCAyKTsKCWdyb3NzZXNfcmVnYWwuYWRkVG9CYXV0ZWlsZShyZWdhbCwgMik7CgoJY291dCA8PCBncm9zc2VzX3JlZ2FsLnRvU3RyaW5nKCkgPDwgZW5kbDsKCgoJcmV0dXJuIDA7Cgp9Cg==