#include <array> // this lets you do std::array<type, size>
class CabinAssignment {
public:
class Column {
char m_value;
public:
Column(char value_ = 0) : m_value(value_) {}
char get() const { return m_value; }
void set(char value_) { m_value = value_; }
};
class Row {
std::array<Column, 9> m_columns;
public:
Row() : m_columns() {}
const Column& col(size_t colNo_) const { return m_columns[colNo_]; }
Column& col(size_t colNo_) { return m_columns[colNo_]; }
};
class Floor {
std::array<Row, 4> m_rows;
public:
Floor() : m_rows() {}
const Row& row(size_t rowNo_) const { return m_rows[rowNo_]; }
Row& row(size_t rowNo_) { return m_rows[rowNo_]; }
};
private:
std::array<Floor, 3> m_floors;
public:
CabinAssignment() : m_floors() {}
const Floor& floor(size_t floorNo_) const { return m_floors[floorNo_]; }
Floor& floor(size_t floorNo_) { return m_floors[floorNo_]; }
};
int main() {
CabinAssignment cab;
cab.floor(1).row(3).col(8) = 'A';
char whoseOnFloor2Row5Col1 = cab.floor(2).row(5).col(1).get();
}
I2luY2x1ZGUgPGFycmF5PiAgLy8gdGhpcyBsZXRzIHlvdSBkbyBzdGQ6OmFycmF5PHR5cGUsIHNpemU+CgpjbGFzcyBDYWJpbkFzc2lnbm1lbnQgewpwdWJsaWM6CiAgICBjbGFzcyBDb2x1bW4gewogICAgICAgIGNoYXIgbV92YWx1ZTsKICAgIHB1YmxpYzoKICAgICAgICBDb2x1bW4oY2hhciB2YWx1ZV8gPSAwKSA6IG1fdmFsdWUodmFsdWVfKSB7fQogICAgICAgIGNoYXIgZ2V0KCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZTsgfQogICAgICAgIHZvaWQgc2V0KGNoYXIgdmFsdWVfKSB7IG1fdmFsdWUgPSB2YWx1ZV87IH0KICAgIH07CiAgICAKICAgIGNsYXNzIFJvdyB7CiAgICAgICAgc3RkOjphcnJheTxDb2x1bW4sIDk+IG1fY29sdW1uczsKICAgIHB1YmxpYzoKICAgICAgICBSb3coKSA6IG1fY29sdW1ucygpIHt9CiAgICAgICAgY29uc3QgQ29sdW1uJiBjb2woc2l6ZV90IGNvbE5vXykgY29uc3QgeyByZXR1cm4gbV9jb2x1bW5zW2NvbE5vX107IH0KICAgICAgICBDb2x1bW4mIGNvbChzaXplX3QgY29sTm9fKSB7IHJldHVybiBtX2NvbHVtbnNbY29sTm9fXTsgfQogICAgfTsKICAgIAogICAgY2xhc3MgRmxvb3IgewogICAgICAgIHN0ZDo6YXJyYXk8Um93LCA0PiBtX3Jvd3M7CiAgICBwdWJsaWM6CiAgICAgICAgRmxvb3IoKSA6IG1fcm93cygpIHt9CiAgICAgICAgY29uc3QgUm93JiByb3coc2l6ZV90IHJvd05vXykgY29uc3QgeyByZXR1cm4gbV9yb3dzW3Jvd05vX107IH0KICAgICAgICBSb3cmIHJvdyhzaXplX3Qgcm93Tm9fKSB7IHJldHVybiBtX3Jvd3Nbcm93Tm9fXTsgfQogICAgfTsKCnByaXZhdGU6CiAgICBzdGQ6OmFycmF5PEZsb29yLCAzPiBtX2Zsb29yczsKCnB1YmxpYzoKICAgIENhYmluQXNzaWdubWVudCgpIDogbV9mbG9vcnMoKSB7fQogICAgY29uc3QgRmxvb3ImIGZsb29yKHNpemVfdCBmbG9vck5vXykgY29uc3QgeyByZXR1cm4gbV9mbG9vcnNbZmxvb3JOb19dOyB9CiAgICBGbG9vciYgZmxvb3Ioc2l6ZV90IGZsb29yTm9fKSB7IHJldHVybiBtX2Zsb29yc1tmbG9vck5vX107IH0KfTsKCmludCBtYWluKCkgewogICAgQ2FiaW5Bc3NpZ25tZW50IGNhYjsKICAgIGNhYi5mbG9vcigxKS5yb3coMykuY29sKDgpID0gJ0EnOwogICAgY2hhciB3aG9zZU9uRmxvb3IyUm93NUNvbDEgPSBjYWIuZmxvb3IoMikucm93KDUpLmNvbCgxKS5nZXQoKTsKfQ==