C ++: ¿Una forma conveniente de acceder al operador [] desde dentro de la clase?
-
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?
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í!