2010-05-11 16 views
12

Jeżeli mam wskaźnik do obiektu, który ma przeciążony operator indeksie ([]) Dlaczego nie mogę to zrobić:indeks operator na wskaźniki

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

ale trzeba to zrobić w zamian:

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

Można również wykonać 'a [0] [1]' ;-) – fredoverflow

Odpowiedz

16

Jest tak, ponieważ nie można przeciążać operatorów dla typu wskaźnika; możesz przeciążyć tylko operatora, w którym przynajmniej jeden z parametrów (operandów) jest typu klasy lub typu wyliczeniowego.

Tak więc, jeśli masz wskaźnik do obiektu jakiegoś typu klasy, który przeciąży operator indeksu, musisz wyłuskać wskaźnik, aby wywołać jego przeciążonego operatora indeksu.

W twoim przykładzie a ma typ MyClass*; jest to typ wskaźnika, dlatego użyto wbudowanego operator[] dla wskaźników. Gdy wyłuskujesz wskaźnik i uzyskasz MyClass, masz obiekt typu klasowego, więc użyty zostanie przeciążony operator[].

+0

Podobnie jak '->' i '.' są zróżnicowane. – earlNameless

3

Po prostu z a[1] wskaźnik jest traktowany jako tablica zawierająca pamięć i próbujesz uzyskać dostęp do 2. elementu w tablicy (która nie istnieje).

Urządzenie (*a)[1] wymusza najpierw pobranie rzeczywistego obiektu w miejscu wskaźnika, (*a), a następnie wywołanie na nim operatora .

7

Ponieważ a jest wskaźnikiem typu do MyClass, a nie do MyClass. Zmiana języka w celu obsługi pożądanego użycia spowodowałaby przerwanie wielu innych semantyki języka.

można uzyskać składniowej wynik chcesz od:

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

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

dobra wiadomość. Możesz również wykonać ...

a-> operator [] (1);

Aby dodać do preferowanej odpowiedzi, pomyśl o przeciążeniu operatora jako funkcji przeciążającej.

Podczas przeciążania funkcji składowej klasy, należy pamiętać, że wskaźnik nie należy do tego typu klasy.