#include <iostream>
#include <vector>
#include <memory>
using namespace std;
using ElementTypes = int;
const int DOT=1;
class Element {
public:
ElementTypes type = DOT;
Element() {}
Element(ElementTypes type) : type(type) {}
virtual void Draw() { }
};
class Dot : public Element {
public:
int x, y;
Dot(int x, int y) : x(x), y(y) {}
void Draw() override {
cout<<"DrawCircle("<<x<<","<< y<<", 2.f, BLACK);"<<endl;
}
~Dot() { x=-1; y=-1; cout<<"Destroyed"<<endl; } //just to demonstrate before and after destruction
};
class Drawing {
public:
std::vector<shared_ptr<Element>> Elements;
void AddDot(shared_ptr<Element> dot) {
Elements.emplace_back(dot);
}
void Draw() {
for (auto element : Elements) {
element->Draw();
}
}
};
void init (Drawing&d) {
auto dt1 = make_shared<Dot>(10,30);
d.AddDot(dt1);
}
int main() {
Drawing d;
init (d);
d.Draw();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWVtb3J5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdXNpbmcgRWxlbWVudFR5cGVzID0gaW50Owpjb25zdCBpbnQgRE9UPTE7CgpjbGFzcyBFbGVtZW50IHsKcHVibGljOgogICAgRWxlbWVudFR5cGVzIHR5cGUgPSBET1Q7CgogICAgRWxlbWVudCgpIHt9CiAgICBFbGVtZW50KEVsZW1lbnRUeXBlcyB0eXBlKSA6IHR5cGUodHlwZSkge30KCiAgICB2aXJ0dWFsIHZvaWQgRHJhdygpIHsgfQp9OwpjbGFzcyBEb3QgOiBwdWJsaWMgRWxlbWVudCB7CnB1YmxpYzoKICAgIGludCB4LCB5OwoKICAgIERvdChpbnQgeCwgaW50IHkpIDogeCh4KSwgeSh5KSB7fQoKICAgIHZvaWQgRHJhdygpIG92ZXJyaWRlIHsKICAgICAgICBjb3V0PDwiRHJhd0NpcmNsZSgiPDx4PDwiLCI8PCB5PDwiLCAyLmYsIEJMQUNLKTsiPDxlbmRsOyAKICAgIH0KICAgIH5Eb3QoKSB7IHg9LTE7IHk9LTE7IGNvdXQ8PCJEZXN0cm95ZWQiPDxlbmRsOyB9IC8vanVzdCB0byBkZW1vbnN0cmF0ZSBiZWZvcmUgYW5kIGFmdGVyIGRlc3RydWN0aW9uCn07CmNsYXNzIERyYXdpbmcgewpwdWJsaWM6CiAgICBzdGQ6OnZlY3RvcjxzaGFyZWRfcHRyPEVsZW1lbnQ+PiBFbGVtZW50czsKCiAgICB2b2lkIEFkZERvdChzaGFyZWRfcHRyPEVsZW1lbnQ+IGRvdCkgewogICAgICAgIEVsZW1lbnRzLmVtcGxhY2VfYmFjayhkb3QpOwogICAgfQoKICAgIHZvaWQgRHJhdygpIHsgCiAgICAgICAgZm9yIChhdXRvIGVsZW1lbnQgOiBFbGVtZW50cykgewogICAgICAgICAgICBlbGVtZW50LT5EcmF3KCk7CiAgICAgICAgfQogICAgfQp9Owp2b2lkIGluaXQgKERyYXdpbmcmZCkgewoJYXV0byBkdDEgPSBtYWtlX3NoYXJlZDxEb3Q+KDEwLDMwKTsgCglkLkFkZERvdChkdDEpOwp9CmludCBtYWluKCkgewoJRHJhd2luZyBkOyAKCWluaXQgKGQpOwoJZC5EcmF3KCk7IAp9