C ++: ¿Una forma conveniente de acceder al operador [] desde dentro de la clase?

StackOverflow https://stackoverflow.com/questions/605037

  •  03-07-2019
  •  | 
  •  

Pregunta

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

Sé que puedo escribir el operador [] (bar) o this- > operator [] (bar) pero son bastante difíciles de manejar y me quitan un montón de La conveniencia del operador en primer lugar. (También sé que puedo agregar un nuevo método que llame al operador). ¿Hay alguna manera de escribir este [bar] o this- > [bar] o algo similar bien?

Nota : esta pregunta también puede aplicarse a muchos operadores únicos (por ejemplo, ¿cómo puedo llamar a foo ++ desde dentro de la clase?), pero personalmente solo me importa operador [] .

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 alguna otra alternativa?

¿Fue útil?

Solución

(*this)[bar];

funciona bien para mí.

Otros consejos

Una alternativa a (* this) [bar] es usar una función miembro nombrada que hace el trabajo del operador [] . Los operadores sobrecargados hacen las cosas más fáciles para sus usuarios. Más importante aún, son parte de la interfaz de su clase . Pregúntese si realmente tiene sentido implementar su clase en términos de su propia interfaz pública. Si no, sugiero que escriba una función miembro separada (protegida o privada) para hacer el trabajo, y luego haga que el operador [] y cualquier otra función lo llame.

Uso una función at (), y el operador [] llama a la función at () detrás de la escena, por lo que el operador [] es solo azúcar sintáctica. Así es como lo hace std :: vector, por lo que parece una forma razonable (con prioridad) de hacerlo.

Ahora, para un truco de azúcar sintáctico completo (no puedo decir que lo recomiendo totalmente, pero podría sorprenderte):

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 quieres hacer esto gratis, sin pagar el costo de la referencia, Y son seguidores de alguna secta malvada dedicada a hacer sufrir a los programadores que podrías hacer:

#define self (*this)

En realidad creo que así es como se implementan la mayoría de los manejadores en la API NS de Apple ...

Utilizar

(*this)[bar]

para llamar al operador [] del objeto de instancia.

esta [barra] trata el este como una matriz e indexa la barra -th elemento de esa matriz (devolviendo una probable referencia de objeto inválida).

Podrías usar (* esto) [barra] , pero eso podría no ser una gran mejora ...

 operator[](bar) 

Esto debería funcionar también. ¡Funciona para mí!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top