varios propio populares poner personal historias crear como c++ operator-overloading

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



como poner varios hashtag en historias de instagram (6)

Tengo una clase de C ++ que sobrecarga al operator[] , 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 entender cómo usar esta notación cuando estoy implementando métodos dentro de mi clase.

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

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

Edit : 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?


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


Una alternativa a (*this)[bar] es usar una función miembro nombrada que hace el trabajo del operator[] . Los operadores sobrecargados facilitan las cosas a 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 operator[] y cualquier otra función lo llamen.


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 de forma gratuita, sin pagar el costo de la referencia, Y eres seguidor de alguna secta malvada dedicada a hacer sufrir a los programadores, podrías hacerlo:

#define self (*this)

De hecho, 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 operator[] del objeto de instancia.

this[bar] trata el puntero de this como una matriz e indexa el elemento de la bar -ésima de esa matriz (devolviendo una referencia de objeto probablemente no válida).


operator[](bar)

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


(*this)[bar];

funciona bien para mí