2013-04-02 17 views
11

Ho una classe CMatrix, dove è "doppio puntatore" alla matrice di valori.Operatore di sovraccarico C++ [] []

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 fare utilizzando:

x(0,0) = 23; 

Ma ho davvero bisogno di fare che l'altro modo. Qualcuno mi può aiutare con questo? Per favore?

Grazie ragazzi per un aiuto, alla fine 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 vostro aiuto I really appreciate it!

+4

Non v'è alcun 'operatore [] []' a 'C++' e non si può fare uno su, anche ... –

+0

"Ho davvero bisogno di fare questo dall'altra parte" perché? È un incarico? –

+0

basta sovraccaricare l'operatore [] dell'elemento dell'array –

risposta

17

Non c'è operator[][] in C++. Tuttavia, è possibile sovraccaricare operator[] per restituire un'altra struttura e in tale sovraccarico anche operator[] per ottenere l'effetto desiderato.

1

È possibile operator[] e fare in modo che restituisca un puntatore al rispettivo row or column della matrice. Poiché i puntatori supportano la sottoscrizione di [], è possibile accedere dal "quadratino doppio" notation [][].

3

È possibile farlo sovraccaricando operator[] per restituire un int*, che viene quindi indicizzato dalla seconda applicazione di []. Invece di int* potresti anche restituire un'altra classe che rappresenta una riga, di cui operator[] dà accesso ai singoli elementi della riga.

In sostanza, le successive applicazioni dell'operatore [] funzionano sul risultato dell'applicazione precedente.

21

Non si può sovraccaricare operator [][], ma l'idioma comune qui sta usando una classe delega, vale a dire il sovraccarico operator [] per restituire un'istanza della classe diversa che ha 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; 
}; 
+0

Si potrebbe voler rendere la classe 'CMatrix' un' amico' della classe 'CRow', o non sarà in grado di costruire un 'CRow'. –

1

Se si crea una matrice usando contenitori della libreria standard, è banale:

class Matrix { 
    vector<vector<int>> data; 

public: 
    vector<int>& operator[] (size_t i) { return data[i]; } 
}; 
+0

perché questo è compito di scuola Non posso usare nessun'altra libreria grazie a iostream :( –

+1

Questo non era indicato nei requisiti di domanda. –