es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, es posible lograr la funcionalidad deseada mediante sobrecarga de operadores anidados. Podemos sobrecargar el operador[] de la clase ReverseStringAccess para devolver una clase proxy que también sobrecarga el operador[] y nos permite modificar el contenido de cada cadena en el vector.

    Aquí hay una implementación de ejemplo:

    “`c++
    class ReverseStringAccess {
    public:
    ReverseStringAccess() {}
    ReverseStringAccess(vector _arr) : arr(_arr) {}

    // operador[] sobrecargado que devuelve un objeto proxy
    // nos permite usar operador[][] para modificar el contenido de las cadenas
    class StringProxy {
    public:
        StringProxy(string& _str) : str(_str) {}
    
        // operador[] sobrecargado que nos permite modificar el contenido de las cadenas
        char& operator[](int index) {
            int length = str.length();
            return str[length - index - 1];
        }
    
    private:
        string& str;
    };
    
    // operador[] sobrecargado que devuelve un objeto proxy para acceder a la cadena
    StringProxy operator[](int index) {
        return StringProxy(arr[index]);
    }
    

    private:
    vector arr;
    };
    “`

    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 usando ReverseStringAccess[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.

Comments are closed.