c++ - sencillos - sobrecarga de operadores poo
Operador de sobrecarga C++ (5)
Tengo clase CMatrix, donde es "doble puntero" a la matriz de valores.
class CMatrix {
public:
int rows, cols;
int **arr;
};
Simplemente necesito acceder a los valores de la matriz escribiendo:
CMatrix x;
x[0][0] = 23;
Sé cómo hacer eso usando:
x(0,0) = 23;
Pero realmente necesito hacerlo a la inversa. Alguien me puede ayudar con eso? ¿Por favor?
Gracias chicos por la ayuda, al final lo hice de esta manera ...
class CMatrix {
public:
int rows, cols;
int **arr;
public:
int const* operator[]( int const y ) const
{
return &arr[0][y];
}
int* operator[]( int const y )
{
return &arr[0][y];
}
....
Gracias por tu ayuda, ¡realmente lo aprecio!
No hay operator[][]
en C ++. Sin embargo, puede sobrecargar al operator[]
para devolver otra estructura, y en ese operator[]
sobrecarga operator[]
también para obtener el efecto que desea.
No puede sobrecargar el operator [][]
, pero la expresión común aquí es usar una clase proxy , es decir, el operator []
sobrecarga operator []
para devolver una instancia de clase diferente que tiene operator []
sobrecargado. Por ejemplo:
class CMatrix {
public:
class CRow {
friend class CMatrix;
public:
int& operator[](int col)
{
return parent.arr[row][col];
}
private:
CRow(CMatrix &parent_, int row_) :
parent(parent_),
row(row_)
{}
CMatrix& parent;
int row;
};
CRow operator[](int row)
{
return CRow(*this, row);
}
private:
int rows, cols;
int **arr;
};
Podría operator[]
y hacer que devuelva un puntero a la row or column
respectiva de la matriz. Debido a que los punteros soportan la subscripción por [], es posible acceder por la notation [][]
''double-square'' notation [][]
.
Puede hacerlo sobrecargando el operator[]
para devolver un int*
, que luego es indexado por la segunda aplicación de []
. En lugar de int*
también puede devolver otra clase que represente una fila, cuyo operator[]
da acceso a elementos individuales de la fila.
Básicamente, las aplicaciones posteriores del operador [] funcionan sobre el resultado de la aplicación anterior.
Si crea una matriz usando contenedores de Biblioteca estándar, es trivial:
class Matrix {
vector<vector<int>> data;
public:
vector<int>& operator[] (size_t i) { return data[i]; }
};