#include <iostream>
#include <vector>
struct parent
{
virtual ~parent() = default;
virtual void foo() = 0;
};
struct Child : parent
{
Child(int n) : n(n) {}
void foo() override { std::cout << n << std::endl; }
int n;
};
class Grid{
public:
Grid() : col(10), row(10), grid(col * row, nullptr) {}
parent* operator() (std::size_t x, std::size_t y) const {
if (col <= x || row <= y) { throw std::runtime_error("Invalid arguments"); }
return grid[y * col + x];
}
parent*& operator() (std::size_t x, std::size_t y) {
if (col <= x || row <= y) { throw std::runtime_error("Invalid arguments"); }
return grid[y * col + x];
}
private:
int col;
int row;
std::vector<parent*> grid;
};
int main() {
Grid b;
Child c(1);
Child c2(2);
b(1,1) = &c;
b(1,4) = &c2;
b(1,1)->foo(); //calls the first Childs foo()
b(1,4)->foo(); //calls the second Childs foo()
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKc3RydWN0IHBhcmVudAp7CiAgICB2aXJ0dWFsIH5wYXJlbnQoKSA9IGRlZmF1bHQ7CiAgICB2aXJ0dWFsIHZvaWQgZm9vKCkgPSAwOwp9OwoKc3RydWN0IENoaWxkIDogcGFyZW50CnsKCUNoaWxkKGludCBuKSA6IG4obikge30KICAgIHZvaWQgZm9vKCkgb3ZlcnJpZGUgeyBzdGQ6OmNvdXQgPDwgbiA8PCBzdGQ6OmVuZGw7IH0KCWludCBuOwp9OwoKY2xhc3MgR3JpZHsKcHVibGljOgogICAgR3JpZCgpIDogY29sKDEwKSwgcm93KDEwKSwgZ3JpZChjb2wgKiByb3csIG51bGxwdHIpIHt9CgogICAgcGFyZW50KiBvcGVyYXRvcigpIChzdGQ6OnNpemVfdCB4LCBzdGQ6OnNpemVfdCB5KSBjb25zdCB7CiAgICAgICAgaWYgKGNvbCA8PSB4IHx8IHJvdyA8PSB5KSB7IHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiSW52YWxpZCBhcmd1bWVudHMiKTsgfQogICAgICAgIHJldHVybiBncmlkW3kgKiBjb2wgKyB4XTsKICAgIH0KCiAgICBwYXJlbnQqJiBvcGVyYXRvcigpIChzdGQ6OnNpemVfdCB4LCBzdGQ6OnNpemVfdCB5KSB7CiAgICAgICAgaWYgKGNvbCA8PSB4IHx8IHJvdyA8PSB5KSB7IHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiSW52YWxpZCBhcmd1bWVudHMiKTsgfQogICAgICAgIHJldHVybiBncmlkW3kgKiBjb2wgKyB4XTsKICAgIH0KCnByaXZhdGU6CiAgICBpbnQgY29sOwogICAgaW50IHJvdzsKICAgIHN0ZDo6dmVjdG9yPHBhcmVudCo+IGdyaWQ7Cn07CgoKaW50IG1haW4oKSB7CglHcmlkIGI7CglDaGlsZCBjKDEpOwoJQ2hpbGQgYzIoMik7CgkKCWIoMSwxKSA9ICZjOwoJYigxLDQpID0gJmMyOwoJCgliKDEsMSktPmZvbygpOyAvL2NhbGxzIHRoZSBmaXJzdCBDaGlsZHMgZm9vKCkKCWIoMSw0KS0+Zm9vKCk7IC8vY2FsbHMgdGhlIHNlY29uZCBDaGlsZHMgZm9vKCkKfQ==