Dzień dobry,
starałem się cel ująć w tytule, niemniej należy tutaj dokładnie opisać, że mam na myśli rzecz następującą:
Mam (dynamiczną) tablicę jednowymiarową i chcę traktować ją jako dwuwymiarową, zatem chciałbym móc na niej używać podwójnego operatora "[]", gdzie pierwszy naturalnie wskazywałby wiersz, a drugi kolumnę.
Doszedłem do tego:
#include <iostream>
using namespace std;
class Matrix
{
friend class MatrixRow;
private:
double* matrix;
unsigned rows;
unsigned columns;
unsigned rowIdx=0;
class MatrixRow
{
friend class Matrix;
private:
double operator[](unsigned i)
{
return Matrix::matrix[Matrix::rowIdx+i];
}
};
public:
Matrix(unsigned rows, unsigned columns)
{
this->rows=rows;
this->columns=columns;
matrix=new double[rows*columns];
for(unsigned i=0; i<rows*columns; i++)
{
matrix[i]=static_cast<double>(i)+0.1;
}
}
void operator[](unsigned i) const
{
rowIdx=i;
MatrixRow::operator[]()
}
void operator=(double* matrix)
{
this->matrix=matrix;
}
};
int main()
{
Matrix matrix(3, 4);
cout << matrix[2][3];
return 0;
}
W pierwszym operatorze [], którego przeciążenie obsługuje sama klasa Matrix, muszę przekazać indeks wiersza. Mogę sprawić, że klasa wewnętrzna, MatrixRow, będzie znała ten indeks poprzez zaprzyjaźnienie klas i dodatkowe pole RowIdx. Natomiast nie wiem, co z wywołaniem przeciążenia operatora w klasie MatrixRow. Co ja mam przekazać jako argument? Nie wiem, może już od początku to jest zły.
Proszę o wskazówki.