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?

È stato utile?

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!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top