#include <iostream>
#include <vector>
using namespace std;
class P {
private:
string name;
public:
P(string n) : name(n) {}
virtual string toString() const {
return "P_" + name +"\n" ;
}
virtual P * adapter(double nbFois) {
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;
public:
Bauteile(string n) : name(n) {
}
void add(const P & p, int amount) {
I i(p, amount);
teile.push_back(i);
}
string toString() const {
string s;
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 amount) {
bauteile.add(p, amount);
}
Moebel * adapter(double nbFois) {
cout << "Moebel_adapt" << endl;
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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCgpjbGFzcyBQIHsKICBwcml2YXRlOgogICAgc3RyaW5nIG5hbWU7CiAgICAKICBwdWJsaWM6CiAgICBQKHN0cmluZyBuKSA6IG5hbWUobikge30KICAgIAogICAgdmlydHVhbCBzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CgkJcmV0dXJuICJQXyIgKyBuYW1lICsiXG4iIDsKCX0KCQoJdmlydHVhbCBQICogYWRhcHRlcihkb3VibGUgbmJGb2lzKSB7CgkJcmV0dXJuIHRoaXM7Cgl9CgkKfTsKCgoKY2xhc3MgSSB7CiAgcHVibGljOgogICAgSShjb25zdCBQICYgcF8sIGludCBhKSA6IHAocF8pLCBhbW91bnQoYSkgewoJfQoJCglzdHJpbmcgZGVzYygpIGNvbnN0IHsKCSAgIHN0cmluZyBzOwoJICAgcyArPSAiICIgKyB0b19zdHJpbmcoYW1vdW50KSArICIgKiAiOwoJICAgcyArPSAiIElfIjsKCSAgIC8vIGNhbGwgUDo6dG9TdHJpbmcgb3IgTW9lYmVsOjp0b1N0cmluZygpID8KCSAgIHMgKz0gcC50b1N0cmluZygpOwoJICAgCgkgICByZXR1cm4gczsKCX0KICAKICBwcml2YXRlOgogICAgY29uc3QgUCAmIHA7ICAKICAgIGludCBhbW91bnQ7CiAgCn07CgoKY2xhc3MgQmF1dGVpbGUgewoJCglwcml2YXRlOgoJICB2ZWN0b3I8ST4gdGVpbGU7CgkgIHN0cmluZyBuYW1lOwoJICAKCXB1YmxpYzoKCSAgIEJhdXRlaWxlKHN0cmluZyBuKSA6IG5hbWUobikgewoJICAgfQoJICAgCgkgICB2b2lkIGFkZChjb25zdCBQICYgcCwgaW50IGFtb3VudCkgewoJCSAgIEkgaShwLCBhbW91bnQpOwoJCSAgIHRlaWxlLnB1c2hfYmFjayhpKTsKCSAgIH0KCSAgIAoJICAgc3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgewoJCSAgIHN0cmluZyBzOwoJCSAgIGZvciAoYXV0byBpIDogdGVpbGUpIHsKCQkJICAgcyArPSAiICAiOwoJCQkgICBzICs9IGkuZGVzYygpICsgIlxuIjsKCQkgICB9CgkJICAgcmV0dXJuIHM7CgkgICB9CgkgICAKCn07CgoKY2xhc3MgTW9lYmVsIDogcHVibGljIFAgewoJCglwcml2YXRlOgoJICBCYXV0ZWlsZSBiYXV0ZWlsZTsKCQoJCglwdWJsaWM6CgkKCU1vZWJlbChzdHJpbmcgbikgOiBQKG4pLCBiYXV0ZWlsZShuKSB7Cgl9CgkKCXN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKCQlzdHJpbmcgczsKCQlzICs9ICJNb2ViZWwgIjsKCQlzICs9IFA6OnRvU3RyaW5nKCk7CgkJcyArPSBiYXV0ZWlsZS50b1N0cmluZygpOwoJCQoJCXJldHVybiBzOwoJfQoJCgl2b2lkIGFkZFRvQmF1dGVpbGUoY29uc3QgUCAmIHAsIGludCBhbW91bnQpIHsKCQliYXV0ZWlsZS5hZGQocCwgYW1vdW50KTsKCX0KCglNb2ViZWwgKiBhZGFwdGVyKGRvdWJsZSBuYkZvaXMpIHsKCQljb3V0IDw8ICJNb2ViZWxfYWRhcHQiIDw8IGVuZGw7CgkJcmV0dXJuIHRoaXM7Cgl9CgkKCn07CgppbnQgbWFpbigpIHsKCiAgLy8gQmF1dGVpbGUKICBQIHAxKCJzY2hyYXViZW4iKTsKICBQIHAyKCJicmV0dCIpOwogIAogIE1vZWJlbCByZWdhbCgiUmVnYWwiKTsKICByZWdhbC5hZGRUb0JhdXRlaWxlKHAxLCAxKTsKICByZWdhbC5hZGRUb0JhdXRlaWxlKHAyLCA0KTsKICAKICBjb3V0IDw8IHJlZ2FsLnRvU3RyaW5nKCkgPDwgZW5kbDsKICAKICBQIHAzKCJob2x6dHVlciIpOwogIE1vZWJlbCBncm9zc2VzX3JlZ2FsKCJHcm9zc2VzX3JlZ2FsIik7CiAgZ3Jvc3Nlc19yZWdhbC5hZGRUb0JhdXRlaWxlKHAzLCAyKTsKICBncm9zc2VzX3JlZ2FsLmFkZFRvQmF1dGVpbGUocmVnYWwsIDIpOwogIAogIGNvdXQgPDwgZ3Jvc3Nlc19yZWdhbC50b1N0cmluZygpIDw8IGVuZGw7CiAgCgogIHJldHVybiAwOwogIAp9Cg==