Создание дополнительного класса для класса двумерных матриц
Столкнулся с такой проблемой при создании класса двумерных матриц:
Ошибки:
E0461 начальное значение ссылки на неконстантный параметр должно быть левосторонним значением
C2440 return: невозможно преобразовать "Matrix::MatrixRow" в "double &"
По смыслу все понятно: Наш оператор [] в class Matrix возвращает указатель на один из строк, а далее оператор [] находящийся в class MatrixRow возвращает уже сам элемент из массива. Вообще, данный код ниже мне написал Chat GPT, поскольку столкнулся с таким синтаксисом впервые, просто хочу узнать в чем конкретно ошибся. Нашел статью с данном ошибкой на stack overflow западном, но не знаю как применить данное решение ошибки на моем примере https://stackoverflow.com/questions/55083497/c-cannot-convert-input-param-to-reference
class MatrixRow{
public:
MatrixRow(double* matrixRow) : matrixRow(matrixRow) {}
double& operator[](int index){
return matrixRow[index];
}
private:
double* matrixRow;
};
class Matrix{
MatrixRow& operator[](int index){
return MatrixRow(matrix_arr[index]);
}
private:
double** matrix_arr;
};
Ответы (2 шт):
Вы ссылаетесь на временный объект. Он является только копией того участка памяти, который вы имели ввиду. Указатель же указывает именно на память
double* operator[](int index) {
return matrix_arr[index];
}
Лучше всего удалить класс MatrixRow в принципе и возвращать обычный указатель на массив из double
Возвращайте копию ряда. Ряд состоит из одного указателя, возвращение его по значению не влияет на производительность.
MatrixRow operator[](int index){
return MatrixRow(matrix_arr[index]);
}
P.S. Прочитайте учебник про указатели и ссылки. И про время их жизни.