2010-05-11 15 views
12

Se ho un puntatore ad un oggetto che ha un operatore pedice sovraccaricato ([]) perché non posso fare questo:operatore pedice su puntatori

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

ma hanno a che fare questo, invece:

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

Si potrebbe anche fare 'a [0] [1]' ;-) – fredoverflow

risposta

16

È perché non è possibile sovraccaricare gli operatori per un tipo di puntatore; è possibile solo sovraccaricare un operatore in cui almeno uno dei parametri (operandi) è di tipo classe o tipo di enumerazione.

Pertanto, se si dispone di un puntatore a un oggetto di un tipo di classe che sovraccarica l'operatore di pedice, è necessario dereferenziare tale puntatore per chiamare l'operatore di pedice sovraccarico.

Nel proprio esempio, a ha il tipo MyClass*; questo è un tipo di puntatore, quindi viene utilizzato il puntatore incorporato operator[] per i puntatori. Quando si dereferenzia il puntatore e si ottiene un MyClass, si dispone di un oggetto di tipo classe, quindi viene utilizzato il sovraccarico operator[].

+0

Proprio come '->' e '.' sono differenziati. – earlNameless

3

In poche parole, con a[1] il puntatore a viene considerato come memoria contenente l'array e si sta tentando di accedere al secondo elemento dell'array (che non esiste).

I (*a)[1] le forze per ottenere innanzitutto l'oggetto vero e proprio in corrispondenza della posizione del puntatore, (*a), e poi chiamare l'operatore [] su di esso.

7

Perché a è il puntatore del tipo a MyClass e non a MyClass. Cambiare la lingua per supportare l'uso desiderato renderebbe molte altre semantiche linguistiche interrotte.

è possibile ottenere il risultato che si desidera da sintattica:

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

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

Buone notizie. È inoltre possibile ...

a-> operatore [] (1);

Per aggiungere alla risposta preferita, pensare all'overloading dell'operatore come funzioni di sovraccarico.

In caso di sovraccarico della funzione membro di una classe, si ricorda che il puntatore non è di quel tipo di classe.