#include <iostream>
#include <list>
#include <memory>
#include <typeinfo>
using namespace std;
class Abstract
{
public:
virtual string toString() const = 0;
virtual shared_ptr<Abstract> clone() const= 0;
};
class A : public Abstract
{
public:
A(int a, int b) : a(a), b(b)
{}
string toString() const override { return "A"; }
shared_ptr<Abstract> clone() const override { return make_shared<A>(*this); }
private:
int a;
int b;
};
class B : public Abstract
{
public:
B(int b) : b(b)
{}
string toString() const { return "B"; }
shared_ptr<Abstract> clone() const override { return make_shared<B>(*this); }
private:
int b;
};
class Data
{
public:
Data(const string & name) : name (name)
{}
Data& AddData ( const Abstract & a )
{
//Need to fix next line
l1.push_back(a.clone());
return (*this);
}
void show() const {
for (auto& x: l1)
cout << x->toString()<<"("<< typeid(*x).name()<<") ";
cout <<endl;
}
private:
list<shared_ptr<Abstract>> l1;
string name;
};
int main() {
Data test("Random Name");
test.AddData(A(1,2))
.AddData(B(3))
.AddData(B(4));
test.show();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPHR5cGVpbmZvPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCmNsYXNzIEFic3RyYWN0CnsKICBwdWJsaWM6CiAgICB2aXJ0dWFsIHN0cmluZyB0b1N0cmluZygpIGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgc2hhcmVkX3B0cjxBYnN0cmFjdD4gY2xvbmUoKSBjb25zdD0gMDsgCn07CgpjbGFzcyBBIDogcHVibGljIEFic3RyYWN0CnsKICBwdWJsaWM6CiAgICBBKGludCBhLCBpbnQgYikgOiBhKGEpLCBiKGIpCiAgICB7fQogICAgc3RyaW5nIHRvU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gIkEiOyB9CiAgICBzaGFyZWRfcHRyPEFic3RyYWN0PiBjbG9uZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1ha2Vfc2hhcmVkPEE+KCp0aGlzKTsgfSAKICAgCiAgcHJpdmF0ZToKICAgIGludCBhOwogICAgaW50IGI7Cn07CmNsYXNzIEIgOiBwdWJsaWMgQWJzdHJhY3QKewogIHB1YmxpYzoKICAgIEIoaW50IGIpIDogYihiKQogICAge30KICAgIHN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsgcmV0dXJuICJCIjsgfQogICAgc2hhcmVkX3B0cjxBYnN0cmFjdD4gY2xvbmUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtYWtlX3NoYXJlZDxCPigqdGhpcyk7IH0gCiAgcHJpdmF0ZToKICAgIGludCBiOwp9OwoKY2xhc3MgRGF0YQp7CiAgcHVibGljOgogICAgRGF0YShjb25zdCBzdHJpbmcgJiBuYW1lKSA6IG5hbWUgKG5hbWUpIAogICAge30KICAgIERhdGEmIEFkZERhdGEgKCBjb25zdCBBYnN0cmFjdCAmIGEgKQogICAgewogICAgICAgIC8vTmVlZCB0byBmaXggbmV4dCBsaW5lCiAgICAgICAgbDEucHVzaF9iYWNrKGEuY2xvbmUoKSk7CiAgICAgICAgcmV0dXJuICgqdGhpcyk7ICAgCiAgICB9CiAgICB2b2lkIHNob3coKSBjb25zdCB7CiAgICAJZm9yIChhdXRvJiB4OiBsMSkgCiAgICAJICAgIGNvdXQgPDwgeC0+dG9TdHJpbmcoKTw8IigiPDwgdHlwZWlkKCp4KS5uYW1lKCk8PCIpICI7CiAgICAJIGNvdXQgPDxlbmRsOyAKICAgIH0KICBwcml2YXRlOgogICAgbGlzdDxzaGFyZWRfcHRyPEFic3RyYWN0Pj4gbDE7CiAgICBzdHJpbmcgbmFtZTsKfTsKCmludCBtYWluKCkgewoJRGF0YSB0ZXN0KCJSYW5kb20gTmFtZSIpOwoKICAgIHRlc3QuQWRkRGF0YShBKDEsMikpIAogICAgICAgIC5BZGREYXRhKEIoMykpCiAgICAgICAgLkFkZERhdGEoQig0KSk7CiAgICB0ZXN0LnNob3coKTsgCiAgICAKCXJldHVybiAwOwp9