2009-12-28 9 views

risposta

10

La soluzione più semplice consiste nell'utilizzare l'operatore() in quanto consente più parametri.

class M 
{ 
    public: 
     int& operator()(int x,int y) {return at(x,y);} 
    // .. Stuff to hold data and implement at() 
}; 


M a; 
a(1,2) = 4; 

Il modo più semplice è che il primo operatore [] restituisce un oggetto intermedio che il secondo operatore [] restituisce il valore dalla matrice.

class M 
{ 
    public: 
    class R 
    { 
     private: 
      friend class M; // Only M can create these objects. 
      R(M& parent,int row): m_parent(parent),m_row(row) {} 
     public: 
       int& operator[](int col) {return m_parent.at(m_row,col);} 
     private: 
       M& m_parent; 
       int m_row; 
    }; 

    R operator[](int row) {return R(*this,row);} 

    // .. Stuff to hold data and implement at() 
}; 

M b; 
b[1][2] = 3; // This is shorthand for: 

R row = b[1]; 
int& val = row[2]; 
val  = 3; 
+0

Un buon ottimizzatore potrebbe modificare la versione proxy in un codice altrettanto efficiente come 'operator()'? – GManNickG

+0

Dipende dal compilatore. Ma mi piace rendere l'uso dei miei oggetti il ​​più intuibile possibile. Più è naturale usare l'oggetto, meno è probabile l'operabilità per gli errori. Personalmente preferisco il proxy ma sei sei una mezza l'altra per questa situazione e non potrei dire in modo definitivo che uno è migliore dell'altro. –

+0

Sì, ho sempre usato 'operator()' ma penso che userò un proxy questa volta (scrivo motori di gioco) e vedere se crea problemi. Non riesco a immaginare che sarebbe troppo difficile per il compilatore renderlo altrettanto veloce, dal momento che avrà la definizione completa di tutti gli operatori. – GManNickG

1

Dal momento che si desidera memorizzare i vostri elementi in array a dimensione fissa sarà abbastanza semplice:

#define ROWS 3 
#define COLS 4 

typedef int row_type[COLS]; 

class matrix { 
    row_type elements[ROWS]; 
public: 
    ... 
    row_type const& operator[](int r) const {return elements[r];} 
    row_type  & operator[](int r)  {return elements[r];} 
    ... 
}; 

che dovrebbe funzionare.

Inoltre, è possibile sostituire gli #define con costanti appropriate o utilizzare i parametri del modello per type (int) e size (3x4) per rendere la classe matrix più generica. Se si desidera supportare le dimensioni dinamiche, l'operatore [] deve restituire oggetti proxy. È possibile ma probabilmente dovresti preferire operator() con due parametri di indice per l'accesso agli elementi.