Для многомерной индексации в классе Matrix используй operator() вместо operator[]. Основная причина в том, что operator[] принимает только один параметр, а operator() может принимать несколько параметров. Для прямоугольной матрицы нужны два параметра (строка и столбец).
class Matrix {
public:
Matrix(unsigned rows, unsigned cols);
double& operator()(unsigned row, unsigned col);
double operator()(unsigned row, unsigned col) const;
~Matrix();
Matrix(const Matrix& m);
Matrix& operator=(const Matrix& m);
private:
unsigned rows_, cols_;
double* data_;
};
Создай две версии оператора индексации:
Обе версии должны:
BadIndex), если индекс выходит за границыcols_*row + colinline double& Matrix::operator()(unsigned row, unsigned col) {
if (row >= rows_ || col >= cols_)
throw BadIndex("Matrix subscript out of bounds");
return data_[cols_*row + col];
}
inline double Matrix::operator()(unsigned row, unsigned col) const {
if (row >= rows_ || col >= cols_)
throw BadIndex("const Matrix subscript out of bounds");
return data_[cols_*row + col];
}
Обращайся к элементам матрицы, используя синтаксис m(row, column):
Matrix m(10, 10);
m(5, 8) = 106.15; // Запись
std::cout << m(5, 8); // Чтение
Такой подход даёт чистый и понятный интерфейс для многомерного доступа к массивам, при этом сохраняя проверку границ и типобезопасность.
Оператор operator[] может принимать несколько параметров для прямой индексации многомерных массивов, что делает его одинаково подходящим как operator() для классов Matrix.
Новый — ещё не проверен сообществом
Вы