Матрица

Требуется реализовать класс для работы с матрицами и их подматрицами. Для храения матрицы размера N на M используется линейное представление — массив из N*M элементов. Необходимый набор операций: создание матрицы заданного размера, получение размеров матрицы, получение и изменение элемента по заданным индексам, поэлементное сложение (для матриц однакового размера), печать, копирование, удаление с освобождением памяти, взятие подматрицы.

Подматрицы реализуются отдельным классом, который не выделяет память для хранения матрицы. В этом классе хранится указатель на "основную" матрицу.

В случае обнаружения ошибочных данных методы должны генерировать исключения.

Требования.