Operatore di sovraccarico C ++

Ho class CMatrix, dove è “doppio puntatore” per matrice di valori.

class CMatrix { public: int rows, cols; int **arr; }; 

Ho semplicemente bisogno di accedere ai valori di matrice digitando:

 CMatrix x; x[0][0] = 23; 

So come farlo usando:

 x(0,0) = 23; 

Ma ho davvero bisogno di farlo nell’altro modo. Qualcuno mi può aiutare con questo? Per favore?

Grazie ragazzi per l’aiuto, alla fine l’ho fatto in questo modo …

 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]; } .... 

Grazie per il tuo aiuto lo apprezzo davvero!

Non è ansible sovraccaricare l’ operator [][] , ma l’idioma comune qui sta utilizzando una class proxy , ovvero l’overload operator [] per restituire un’istanza di class diversa che ha l’ operator [] sovraccarico. Per esempio:

 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; }; 

Non c’è operator[][] in C ++. Tuttavia, è ansible sovraccaricare l’ operator[] per restituire un’altra struttura e anche in quell’operatore di overload operator[] per ottenere l’effetto desiderato.

Puoi farlo sovraccaricando l’ operator[] per restituire un int* , che viene quindi indicizzato dalla seconda applicazione di [] . Invece di int* potresti anche restituire un’altra class che rappresenta una riga, il cui operator[] dà accesso ai singoli elementi della riga.

In sostanza, le successive applicazioni dell’operatore [] lavorano sul risultato dell’applicazione precedente.

È ansible operator[] e renderlo restituisce un puntatore alla rispettiva row or column della matrice. Poiché i puntatori supportano l’indice di [], è ansible accedere alla notation [][] “double-square” notation [][] .

Se crei una matrice utilizzando i contenitori della Libreria standard, è banale:

 class Matrix { vector> data; public: vector& operator[] (size_t i) { return data[i]; } };