#include <iostream>
#include <string> 

class Matrix {
	std::string **m;
	int m_x, m_y;
public:
	Matrix(int x, int y) : m_x(x), m_y(y) {
		m = new std::string*[x];
		for (int i = 0; i < x; ++i)
			m[i] = new std::string[y];
	}

	~Matrix() {
		for (int i = 0; i < m_x; ++i)
			delete[] m[i];
		delete[] m;
	}

	void print() const {
		for(int i = 0; i < m_x; ++i) {
			for (int j = 0; j < m_y; ++j) {
				std::cout << '[' << m[i][j] << ']';
			}
			std::cout << std::endl;
		}
	}

	class Proxy {
		std::string *mm;
	public:
		Proxy(std::string *s) : mm(s) {}

		std::string& operator[](int index) {
			return mm[index];
		}
	};

	Proxy operator[](int index) {
		return Proxy(m[index]);
	}
};

int main()
{
	Matrix *m = new Matrix(5, 5);
	m->print();
	(*m)[2][2] = "It Works";
	std::cout << (*m)[2][2] << std::endl;
	m->print();
	delete m;
	return 0;
}