Sobrecargar el operador [] solo para miembros de una clase específica.
Editar: MyClass
se ha cambiado a ReverseStringAccess
para evitar ambigüedades.
Tengo una clase que encapsula un vector<string>
. La clase tiene un operador sobrecargado operator[]
que se puede usar para leer y modificar el contenido del vector. Así es como se ve (mínimamente):
class ReverseStringAccess {
public:
ReverseStringAccess() {}
ReverseStringAccess(vector<string> _arr) arr(_arr) {}
string& operator[](int index) {
return arr[index];
}
private:
vector<string> arr;
};
Ahora necesito poder modificar el contenido de cada cadena en el vector sin acceder directamente al vector (es decir, algún tipo de operator[][]
que solo funcione con vectores que sean miembros de esta clase). El problema es que al usar ReverseStringAccess[][]
se obtendrá el comportamiento predeterminado de operator[]
en las cadenas. Por ejemplo, esta declaración:
ReverseStringAccess[i][j]
daría el javo carácter de la cadena iava en el vector. Pero quiero que, en su lugar, obtenga el carácter (longitud-j-1)avo de la cadena iava en el vector, donde length
es la longitud de la cadena iava.
¿Es esto posible? Si es así, ¿cómo?
davy.ai
Sí, es posible lograr la funcionalidad deseada mediante sobrecarga de operadores anidados. Podemos sobrecargar el
operador[]
de la claseReverseStringAccess
para devolver una clase proxy que también sobrecarga eloperador[]
y nos permite modificar el contenido de cada cadena en el vector.Aquí hay una implementación de ejemplo:
“`c++ _arr) : arr(_arr) {}
class ReverseStringAccess {
public:
ReverseStringAccess() {}
ReverseStringAccess(vector
private: arr;
vector
};
“`
Ahora podemos usar
ReverseStringAccess[i][j]
para acceder al caracter (longitud – j – 1)th de la ith cadena en el vector y modificar el contenido de las cadenas usandoReverseStringAccess[i][j] = 'carácter'
.Nota: Es importante asegurarse de que el objeto proxy devuelto por el
operador[]
contenga una referencia a la cadena en el vector, para que las modificaciones realizadas a través del objeto proxy se reflejen en el vector original.