C ++: modo conveniente per accedere all'operatore [] dall'interno della classe?
-
03-07-2019 - |
Domanda
Ho una classe C ++ che sovraccarica l'operatore []
, l'operatore di matrice / parentesi. Questo è terribilmente conveniente al di fuori della mia classe, dove posso scrivere foo [bar
]. Tuttavia, non riesco a capire come usare questa notazione quando sto implementando i metodi all'interno della mia classe.
So di poter scrivere operator [] (bar)
o this- > operator [] (bar)
ma quelli sono abbastanza ingombranti e portano via un sacco di la comodità dell'operatore in primo luogo. (So ??anche che posso solo aggiungere un nuovo metodo che chiama l'operatore.) Esiste un modo per scrivere this [bar]
o this- > [bar]
o qualcosa di altrettanto bello?
Nota : questa domanda può applicarsi anche a molti operatori unari (ad esempio, come posso chiamare foo ++
all'interno della classe?), ma a me personalmente interessa solo operatore []
.
Modifica : subito dopo la pubblicazione mi sono reso conto che posso usare (* this) [bar]
. Tutte le risposte finora hanno suggerito anche questo. Ci sono altre alternative?
Soluzione
(*this)[bar];
funziona bene per me.
Altri suggerimenti
Un'alternativa a (* this) [bar]
è usare una funzione membro nominata che svolge il lavoro di operator []
. Gli operatori sovraccaricati rendono le cose più facili per i tuoi utenti. Ancora più importante, fanno parte dell ' interfaccia della tua classe. Chiediti se ha davvero senso implementare la tua classe in termini di propria interfaccia pubblica. In caso contrario, suggerisco di scrivere una funzione membro separata (protetta o privata) per eseguire il lavoro, quindi fare in modo che operator []
e qualsiasi altra funzione lo chiami.
Uso una funzione at () e l'operatore [] chiama la funzione at () dietro le quinte, quindi l'operatore [] è solo zucchero sintattico. È così che lo fa std :: vector, quindi sembra un modo ragionevole (con precedenza) per farlo.
Ora per un completo hack di zucchero sintattico (non posso dire che lo consiglio vivamente ma potrei colpire la tua fantasia):
class Widget
{
Widget& self;
public:
Widget() :self(*this)
{}
void operator[](int)
{
printf("hello");
}
void test()
{
//scripting like sugar
//you pay the price of an extra reference per class though
self[1];
}
};
int main(int argc, char* argv[])
{
Widget w;
w[1];
w.test();
return 0;
}
Inoltre, se vuoi farlo gratuitamente, senza pagare il costo del riferimento, E sei un seguace di qualche setta malvagia dedicata a far soffrire i programmatori che potresti fare:
#define self (*this)
In realtà penso che sia così che la maggior parte degli handle sono implementati nell'API NS di Apple ...
Usa
(*this)[bar]
per chiamare l'operatore []
dell'oggetto istanza.
this [bar]
tratta il puntatore this
come una matrice e indicizza la barra
-th elemento di quella matrice (restituendo un probabile- riferimento oggetto non valido).
Potresti usare (* questo) [bar] , ma potrebbe non essere molto un miglioramento ...
operator[](bar)
Anche questo dovrebbe funzionare. Funziona per me!