|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
|
[c++]overloading [][]
dato che non compare nella lista di operatori, come lo si può implementare?
vi spiego... ho una matrice stile c di valori interi (una serie di matrici blosum per chi interessasse per una questione di precompatibilità con il codice già scritto sarebbe carino utilizzare l'accesso tramite [][], ma non ho idea di come si possa implementare... grazie per l'attenzione, ciao! |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
in C++ si può fare l'overload di []. Ad esempio:
Codice:
class vector {
int v[SIZE];
public:
vector() { register x; for (x=0; x<10; x++) v[x] =xi; } //costruttore
int vector::operator[] (int x); } // overload []
}
int vector::operator[] (int x) { return a[x]; } // Primo overload
int &array::operator[] (int x) { return a[x]; } // Secondo overload
// NOTA: con il secondo overload si permette di usare l'operatore a sinistra di un'assgnazione.
// implementazione dell'overload...
Non mi risulta che sia possibilie fare l'overload di [][], ma non ho mai provato. Puoi provarci tu, seguendo l'esempio del codice postato (non ho implementato l'overload dal momento che è banale...).
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
qualcosa di simile al seguente: Codice:
/* ATTENZIONE: Il mio c++ e' un bel po' arrugginito... :D */
class Row
{
typedef value_type int;
typedef size_type int;
Matrix& matrix;
const size_type& row;
public:
Row( Matrix& m, const size_type& r):matrix(m),row(r){}
value_type& operator[](const size_type& col)
{ return matrix.data[row][col]; }
/* ... */
};
class Matrix
{
typedef value_type int;
typedef size_type int;
int rows,cols;
value_type **data;
public:
Row operator[](const size_type& row)
{ return Row(*this,row); }
/* .. */
};
E' possibile che tu perda un po' di efficenza; in linea teorica tutto questo catafalco sarebbe ottimizzabile in un bel "return self.data[row][col]", bisogna vedere se all'atto pratica il compilatore ci riesce .In alternativa prendi in considerazione di passare ad un operator ()(size_type,size_type), molto piu' semplice (soprattutto per il compilatore). Edit: va da se' che la classe Row deve essere friend di Matrix
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:39.











.








