#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(int factor) const {
string s;
s += " " + to_string( factor * 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( anzahl_ ) + "\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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgoKY2xhc3MgUCB7CnByaXZhdGU6CglzdHJpbmcgbmFtZTsKCnB1YmxpYzoKCVAoc3RyaW5nIG4pIDogbmFtZShuKSB7fQoKCXZpcnR1YWwgc3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgewoJCXJldHVybiAiUF8iICsgbmFtZSArICJcbiI7Cgl9CgoJdmlydHVhbCBQICogYW5wYXNzZW4oaW50IGFuemFobCkgewoJCXJldHVybiB0aGlzOwoJfQoKfTsKCgoKY2xhc3MgSSB7CnB1YmxpYzoKCUkoY29uc3QgUCAmIHBfLCBpbnQgYSkgOiBwKHBfKSwgYW1vdW50KGEpIHsKCX0KCglzdHJpbmcgZGVzYyhpbnQgZmFjdG9yKSBjb25zdCB7CgkJc3RyaW5nIHM7CgoJCXMgKz0gIiAiICsgdG9fc3RyaW5nKCBmYWN0b3IgKiBhbW91bnQgKSArICIgKiAiOwoJCXMgKz0gIiBJXyI7CgkJLy8gY2FsbCBQOjp0b1N0cmluZyBvciBNb2ViZWw6OnRvU3RyaW5nKCkgPwoJCXMgKz0gcC50b1N0cmluZygpOwoKCQlyZXR1cm4gczsKCX0KCnByaXZhdGU6Cgljb25zdCBQICYgcDsKCWludCBhbW91bnQ7Cgp9OwoKCmNsYXNzIEJhdXRlaWxlIHsKCnByaXZhdGU6Cgl2ZWN0b3I8ST4gdGVpbGU7CglzdHJpbmcgbmFtZTsKCXVuc2lnbmVkIGludCBhbnphaGxfOwoKCnB1YmxpYzoKCUJhdXRlaWxlKHN0cmluZyBuLCBpbnQgYW56YWhsPTEpIDogbmFtZShuKSwgYW56YWhsXyhhbnphaGwpIHsKCX0KCgl2b2lkIGFkZChjb25zdCBQICYgcCwgaW50IGFtb3VudCkgewoJCUkgaShwLCBhbW91bnQpOwoJCXRlaWxlLnB1c2hfYmFjayhpKTsKCX0KCgl2b2lkIHNldEFuemFobChpbnQgbikgewoJCWFuemFobF8gPSBuOwoJfQoKCXN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKCQlzdHJpbmcgczsKCQlzICs9IHRvX3N0cmluZyggYW56YWhsXykgICsgIlxuIjsKCQlmb3IgKGF1dG8gaSA6IHRlaWxlKSB7CgkJCXMgKz0gIiAgIjsKCQkJcyArPSBpLmRlc2MoIGFuemFobF8gKSArICJcbiI7CgkJfQoJCXJldHVybiBzOwoJfQoKCn07CgoKY2xhc3MgTW9lYmVsIDogcHVibGljIFAgewoKcHJpdmF0ZToKCUJhdXRlaWxlIGJhdXRlaWxlOwoKCnB1YmxpYzoKCglNb2ViZWwoc3RyaW5nIG4pIDogUChuKSwgYmF1dGVpbGUobikgewoJfQoKCXN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKCQlzdHJpbmcgczsKCQlzICs9ICJNb2ViZWwgIjsKCQlzICs9IFA6OnRvU3RyaW5nKCk7CgkJcyArPSBiYXV0ZWlsZS50b1N0cmluZygpOwoKCQlyZXR1cm4gczsKCX0KCgl2b2lkIGFkZFRvQmF1dGVpbGUoY29uc3QgUCAmIHAsIGludCBhbnphaGwpIHsKCQliYXV0ZWlsZS5hZGQocCwgYW56YWhsKTsKCQlhbnBhc3NlbihhbnphaGwpOwoJfQoKCU1vZWJlbCAqIGFucGFzc2VuKGludCBhbnphaGwpIHsKCQkvLyBjb3V0IDw8ICJNb2ViZWxfYWRhcHQiIDw8IGVuZGw7CgkJdGhpcy0+YmF1dGVpbGUuc2V0QW56YWhsKGFuemFobCk7CgkJcmV0dXJuIHRoaXM7Cgl9CgoKfTsKCmludCBtYWluKCkgewoKCS8vIEJhdXRlaWxlCglQIHAxKCJzY2hyYXViZW4iKTsKCVAgcDIoImJyZXR0Iik7CgoJTW9lYmVsIHJlZ2FsKCJSZWdhbCIpOwoJcmVnYWwuYWRkVG9CYXV0ZWlsZShwMSwgMSk7CglyZWdhbC5hZGRUb0JhdXRlaWxlKHAyLCA0KTsKCgljb3V0IDw8IHJlZ2FsLnRvU3RyaW5nKCkgPDwgZW5kbDsKCglQIHAzKCJob2x6dHVlciIpOwoJTW9lYmVsIGdyb3NzZXNfcmVnYWwoIkdyb3NzZXNfcmVnYWwiKTsKCWdyb3NzZXNfcmVnYWwuYWRkVG9CYXV0ZWlsZShwMywgMik7Cglncm9zc2VzX3JlZ2FsLmFkZFRvQmF1dGVpbGUocmVnYWwsIDIpOwoKCWNvdXQgPDwgZ3Jvc3Nlc19yZWdhbC50b1N0cmluZygpIDw8IGVuZGw7CgoKCXJldHVybiAwOwoKfQo=