2011-01-01 37 views
7

Escribo una clase de colección. Quiero sobrecargar el operador de corchetes ([]) para proporcionar acceso a los elementos de la colección.Sobrecarga de operadores de corchetes para aceptar el valor

int operator[](int i) 
{ 
    // Do stuff here 
} 

Mi problema es que no veo cómo escribir esto para que yo pudiera usar este operador para aceptar un valor:

myClassInstance[0] = value; 

no veo ninguna manera de declarar el operador con corchetes un argumento adicional (el valor para asignar al elemento).

Sé que puedo simplemente devolver int & y la persona que llama puede asignar un valor a eso, pero internamente cada elemento se almacena en un formato diferente al que se hizo público.

¿Esto es posible?

+0

necesita dos [] versiones (int) del operador. una versión de const y la versión no const que usted solicitó. La versión original debería tener const detrás de ella, para llamar a un objeto const; –

+0

@Edwin: Vi tu otro comentario. Voy a darle una oportunidad. Gracias. –

Respuesta

9

Escriba una clase int_proxy que sea implícitamente convertible a int y se puede asignar desde int. Usted necesitará por lo menos dos funciones miembro:

operator int(); 
int_proxy& operator=(int); 

En esta clase de proxy, almacenar toda la información que necesita para ser capaz de recuperar y establecer el valor en el contenedor. Realice la recuperación en el operador de conversión y la asignación en el operador de asignación.

+1

Olvidó mencionar que el operador int original [] (int) debe tener un modificador const, lo que le permite invocar objetos const. –

+0

Estaba pensando que podría hacer esto más simplemente que eso. Pero no se ve así. ¡Gracias! –

+0

@Edwin: ¿Hay alguna forma de hacerlo para que uno pueda leer un objeto 'const' usando' [] ', y ambos leen y escriben un objeto no const usando el mismo operador? – supercat

2

Devuelve una referencia a un objeto que tiene un operador = que puede rellenar el int donde debe ir. Mire el truco del vector booleano en STL para un ejemplo, si no necesariamente un ejemplo maravillosamente ejemplar.

1

escritura:

int& operator[](int i) 
    { 
     // Do stuff here 
    } 
Cuestiones relacionadas