2010-05-11 4 views
12

Wenn ich einen Zeiger auf ein Objekt, das einen überladenen Index-Operator hat ([]) warum kann ich nicht tun:Index-Operator auf Zeiger

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

aber haben diese stattdessen tun:

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

Sie könnten auch 'a [0] [1]' ;-) – fredoverflow

Antwort

16

Es ist weil Sie Operatoren für einen Zeigertyp nicht überladen können; Sie können einen Operator nur überladen, wenn mindestens einer der Parameter (Operanden) Klassen- oder Aufzählungstyp ist.

Wenn Sie also einen Zeiger auf ein Objekt eines bestimmten Klassentyps haben, der den Subscript-Operator überlädt, müssen Sie diesen Zeiger dereferenzieren, um seinen überladenen Subscript-Operator aufzurufen. In Ihrem Beispiel hat a den Typ MyClass*; Dies ist ein Zeigertyp, so dass das eingebaute operator[] für Zeiger verwendet wird. Wenn Sie den Zeiger dereferenzieren und eine MyClass erhalten, haben Sie ein Objekt vom Typ class, so dass das überladene operator[] verwendet wird.

+0

Wie '->' und '.' werden unterschieden. – earlNameless

3

Einfach ausgedrückt, mit a[1] der Zeiger a wird als Speicher mit Array behandelt, und Sie versuchen, auf das zweite Element im Array zugreifen (die nicht vorhanden ist).

Die (*a)[1] Kräfte, um zuerst das tatsächliche Objekt an der Zeigerposition, (*a), und rufen Sie dann den Operator [] darauf.

7

Da a ist Typ Zeiger auf eine MyClass und nicht eine MyClass. Das Ändern der Sprache, um Ihre gewünschte Verwendung zu unterstützen, würde viele andere Sprach-Semantiken brechen lassen.

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

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

Gute Nachrichten:

Sie können die syntaktischen Ergebnis Sie wollen bekommen. Sie können auch ...

a-> operator [] (1);

Um die bevorzugte Antwort hinzuzufügen, denken Sie an Überlastung des Operators als Überlastungsfunktionen.

Wenn Sie die Memberfunktion einer Klasse überladen, erinnern Sie sich, dass der Zeiger nicht von diesem Klassentyp ist.