2009-03-03 9 views
25

Tengo una clase C++ que sobrecarga operator[], el operador de subíndices/corchetes de la matriz. Esto es muy conveniente fuera de mi clase, donde puedo escribir foo[bar]. Sin embargo, no puedo entender cómo usar esta notación cuando estoy implementando los métodos dentro de mi clase.C++: forma conveniente de acceder al operador [] desde dentro de la clase?

Sé que puedo escribir operator[](bar) o this->operator[](bar) pero son bastante difíciles de manejar y le quitan mucha comodidad al operador en primer lugar. (También sé que puedo agregar un nuevo método que llame al operador.) ¿Hay alguna manera de escribir this[bar] o this->[bar] o algo similar?

Nota: Esta pregunta puede también aplicarse a los muchos operadores unitarios, pero yo personalmente sólo se preocupan por operator[] (por ejemplo, ¿cómo puedo llamar foo++ desde dentro de la clase?).

Editar: Me di cuenta poco después de publicar que puedo usar (*this)[bar]. Todas las respuestas hasta ahora han sugerido esto también. ¿Hay otras alternativas?

+0

Agregó un truco sintáctico de azúcar que podría gustarle (pero no es una solución estándar) –

Respuesta

39
(*this)[bar]; 

funciona bien para mí.

+0

Si alguien tiene otras alternativas, por favor avíseme. Hasta entonces (si es que alguna vez), estoy aceptando esta respuesta. Gracias. –

3

Uso

(*this)[bar] 

para llamar al operator[] del objeto de instancia.

this[bar] trata el puntero this como una matriz y los índices del elemento -ésimo bar de esa matriz (volviendo una referencia de objeto probable-no válido).

1

Usted podría utilizar (* esto) [bar], pero que podría no ser mucho de una mejora ...

3

Una alternativa a (*this)[bar] es utilizar una función miembro llamada que hace el trabajo de operator[] . Los operadores sobrecargados facilitan las cosas a los usuarios. Más importante aún, son parte de su clase 'interfaz. Pregúntese si realmente tiene sentido implementar su clase en términos de su propia interfaz pública. Si no, sugiero escribir una función de miembro separada (protegida o privada) para hacer el trabajo, y luego tener operator[] y cualquier otra función llamarlo.

3

Utilizo una función at(), y hago que el operador [] llame a la función at() detrás de las escenas, por lo que el operador [] es simplemente azúcar sintáctico. Así es como lo hace std :: vector, por lo que parece una forma razonable (con prioridad) de hacerlo.

Ahora, para un corte completo de azúcar sintáctica (no se puede decir que lo recomiendo totalmente, pero podría golpear a su fantasía):

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; 
} 

Además, si usted quiere hacer esto de forma gratuita, sin tener que pagar el costo de la referencia, Y es un seguidor de una secta del mal dedicado a hacer sufrir a los programadores que podría hacer:

#define self (*this) 

de hecho, creo que es como la mayoría de los mangos se implementan en la API de NS de Apple ...

+0

Me gusta esto, en cierto sentido, porque la forma en que lo he estado haciendo durante los últimos minutos ha sido establecer self = * this y luego usar self. Gracias. –

+6

Vector es al revés, porque vector :: at() tiene que hacer una comprobación de rango antes de llamar al operador []() – MSalters

1
operator[](bar) 

Esto debería funcionar también. ¡Esto funciona para mi!

+0

En mi pregunta, esa es la primera opción que menciono. –

Cuestiones relacionadas