#include <stdexcept>
using namespace std;
class Matrix
{
protected:
double *matrix;
unsigned size_x, size_y;
public:
Matrix()
{
matrix = NULL;
size_x = size_y = 0;
}
Matrix(unsigned sz_x, unsigned sz_y)
{
matrix = new double[sz_x * sz_y];
size_x = sz_x; size_y = sz_y;
}
/** Во всех операциях, где участвуют две матрицы нужно проверять их совместимость по размеру **/
Matrix& operator+(Matrix &b)
{
}
Matrix& operator-(Matrix &b)
{
}
Matrix& operator*(Matrix &b)
{
}
double* operator[](unsigned index)
{
if(index > sz_y)
throw out_of_range("Index is out of range");
return &matrix[index * sz_x];
}
Matrix& transpose()
{
}
Matrix& reverse()
{
}
};
По поводу доступа к элементам - оператор [] возвращает строку матрицы, т.е. при доступе к элементу матрицы - my_matrix[<номер_строки>][<номер_столбца>], первые скобки возвращают кусок массива, который начинается с необходимой строки (здесь индекс контролируем), а вторые - собственно элемент (здесь уже индекс неконтролируем). Если нужен полный контроль - тогда двойной массив и функция
double get(unsigned i, unsigned j) {}
. Если это не так важно, то можно так, как указано.