2010-05-11 12 views
12

Si tengo un puntero a un objeto que tiene un operador subíndice sobrecargada ([]) por qué no puedo hacer esto:operador subíndice sobre los punteros

MyClass *a = new MyClass(); 
a[1]; 

pero tienen que hacer esto en su lugar:

MyClass *a = new MyClass(); 
(*a)[1]; 
+5

También podría hacer 'a [0] [1]' ;-) – fredoverflow

Respuesta

16

Es porque no puede sobrecargar operadores para un tipo de puntero; solo puede sobrecargar un operador donde al menos uno de los parámetros (operandos) es del tipo de clase o tipo de enumeración.

Por lo tanto, si tiene un puntero a un objeto de algún tipo de clase que sobrecarga el operador de subíndice, debe desreferenciar ese puntero para llamar a su operador de subíndice sobrecargado.

En su ejemplo, a tiene tipo MyClass*; este es un tipo de puntero, por lo que se usa el operator[] incorporado para los punteros. Cuando desreferencia el puntero y obtiene un MyClass, tiene un objeto de clase, por lo que se utiliza el operator[] sobrecargado.

+0

Al igual que '->' y '.' se diferencian. – earlNameless

3

En pocas palabras, con a[1], el puntero a se trata como una memoria que contiene una matriz, y está tratando de acceder al segundo elemento de la matriz (que no existe).

El (*a)[1] obliga a obtener primero el objeto real en la ubicación del puntero, (*a), y luego llamar al operador [] en él.

7

Dado que a es un puntero a tipo MyClass y no MyClass. Cambiar el idioma para apoyar su uso deseado haría que muchas otras semánticas del lenguaje se rompieran.

, usted puede obtener el resultado sintáctica que quieres de:

struct foo { 
    int a[10]; 
    int& operator [](int i) { return a[i]; } 
}; 

main() { 
    foo *a = new foo(); 
    foo &b = *a; 
    b[2] = 3; 
} 
0

Buenas noticias. También puede hacer ...

a-> operador [] (1);

Para agregar a la respuesta preferida, piense en la sobrecarga del operador como funciones de sobrecarga.

Al sobrecargar la función miembro de una clase, recuerde que el puntero no es de ese tipo de clase.

Cuestiones relacionadas