Я хочу реализовать класс матрицы, который использует оператор [] [].не может передать значение const оператору +, которое использует оператор [] []
Я написал код, приведенные ниже, но проблема в том, что я не могу отправить константных значения оператору + !! (ошибка: передача «константную Матрицу», как «это» аргумент "Матрица :: индексатора Matrix :: Оператор сброшенной квалификаторы [-fpermissive])
Если я изменю его на матричный оператор + (Матрица & прочее); Он отлично работает ...
Я думаю, мне нужно две перегрузки матрицы :: Indexer Matrix :: operator [] (int index) для чтения и записи для mat_ (как свойство в C#!) Но как? !
или может быть я должен использовать const_cast?!
Каков наилучший способ реализации этого класса?!
//Matrix.h
class Matrix
{
public:
Matrix(const int rows, const int cols, float defaultValue=0);
//TODO copy constructor , destructor
int rows() const;
int cols() const;
Matrix operator+(const Matrix& other);
class Indexer
{
public:
Indexer(float* arr,int cols);
float& operator[](int index);
private:
float* arr_;
int cols_;
};
Indexer operator[](int index);
private:
int rows_;
int cols_;
float **mat_;
};
Matrix.cpp
#include "matrix.h"
Matrix::Matrix(const int rows, const int cols, float defaultValue) :
rows_(rows),
cols_(cols)
{
mat_=new float*[rows_];
for(int i=0;i<rows;i++)
{
mat_[i]=new float[cols];
}
for(int i=0;i<rows;i++)
{
for(int j=0;j<cols;j++)
{
mat_[i][j]=defaultValue;
}
}
}
int Matrix::rows() const
{
return rows_;
}
int Matrix::cols() const
{
return cols_;
}
Matrix::Indexer::Indexer(float* arr,int cols):
arr_(arr),
cols_(cols)
{}
Matrix::Indexer Matrix::operator[](int index)
{
if(index>=rows_)
throw "Out of row index";
return Indexer(mat_[index],cols_);
}
float& Matrix::Indexer::operator[](int index)
{
if(index>=cols_)
throw "Out of cols index";
return arr_[index];
}
Matrix Matrix::operator+(const Matrix& other)//error
{
if(other.rows()!=this->rows()||other.cols()!=this->cols())
throw "rows and cols are not equal";
Matrix result(other.rows(),other.cols());
for(int i=0;i<rows();i++)
{
for(int j=0;j<cols();j++)
{
result[i][j]=mat_[i][j]+other[i][j];//error: passing 'const Matrix' as 'this' argument of 'Matrix::Indexer Matrix::operator' discards qualifiers [-fpermissive
}
}
return result;
}
@BrettHale Да. В нашем коде '[]' на матрице возвращает 'Row', который не содержит никаких данных сам по себе, а представляет собой представление подмножества данных матрицы. (У нас также есть представление столбца, но это может быть сложно реализовать.) –
@BrettHale Матрица остается большой. Оба 'Row' и' Column' предоставляют представления (проекции) матрицы. –
@BrettHale За исключением того, что в этом нет ничего, что является основным столбцом. Для n-мерной структуры данных существуют (по крайней мере) n проекций на одно измерение. Предоставление одного без предоставления всех из них - отсутствие ортогональности, мягко говоря. –