Versuchen Sie nicht, das zu tun - wie andere gesagt haben, das Überladen von operator []
, wie Sie es tun, stellt die [][]
-Syntax kostenlos zur Verfügung. Aber das ist keine gute Sache.
Im Gegenteil - es zerstört die Einkapselung und das Ausblenden von Informationen Ihrer Klasse, indem ein Implementierungsdetail - der char*
-Zeiger - nach außen gedreht wird. Im Allgemeinen ist dies nicht ratsam.
Eine bessere Methode wäre es, ein operator [,]
zu implementieren, das mehr als ein Argument oder sogar ein operator [][]
benötigt. Aber in C ++ gibt es das auch nicht.
Die übliche Vorgehensweise besteht darin, operator []
insgesamt für mehr als eine Dimension zu entfernen. Die saubere Alternative besteht darin, stattdessen operator ()
zu verwenden, da der Operator mehr als ein Argument haben kann:
Weitere Informationen finden Sie im Artikel in der C ++ - FAQ Lite .
Es gibt keinen Operator [][]
: das sind zwei []
-Operationen in einer Zeile. Du könntest:
Object::operator[]
ein Objekt einer zweiten Klasse zurückgeben, das eine Zeile darstellt, die ihre eigene Methode operator[]
hat, die eine Spaltennummer annimmt; get(int row, int column)
-Methode und verwenden Sie diese anstelle des Überladens des Operators. Ich würde dies empfehlen, es sei denn, Ihr Objekt muss sich absolut wie ein Array verhalten. Es gibt kein operator[][]
. Die Auswertung von a[x][y]
ruft zuerst operator[]
für a
und dann operator[]
für das Ergebnis erneut auf.
Also muss das operator[]
Ihres Objekts ein anderes Objekt mit seinem eigenen operator[]
zurückgeben, das dann auf den angeforderten Wert zugreift.
Es gibt keinen Operator [][]
. Was tatsächlich passiert, ist, dass der zweite []
auf die Variable wirkt, die vom ersten []
zurückgegeben wird. Da diese Funktionalität bereits vorhanden ist, würde dies zu Mehrdeutigkeiten führen, wenn ein [][]
-Operator existiert.
Beispiel: Nehmen wir an, Sie haben eine Variable x
eines Typs T
.
Wenn wir den Operator []
verwenden, sagen wir, dass eine Variable vom anderen Typ Q
zurückgegeben wird:
Wenn Sie dann den Operator []
für eine Variable vom Typ Q
verwenden, wird möglicherweise eine Variable vom Typ R
:
Daher gibt x[][]
eine Variable von t ype R zurück.
Nehmen wir an, wir konnten [][]
für Typ T so überladen, dass ein Typ S zurückgegeben wurde:
Der Compiler hätte keine Möglichkeit zu wissen, ob er den Operator [][]
auf x
verwenden soll, um eine Variable S
zurückzugeben, oder den Operator []
zweimal hintereinander, um den Typ% co_de zurückzugeben % Variable Das ist die oben erwähnte Zweideutigkeit.
Ihre beste Wette , wenn Sie mit eckigen Klammern arbeiten ist, dass R
eine Variable zurückgibt, die auch operator[]
überladen hat (oder vielleicht eine Variable desselben Typs mit gesetztem Flag) , und haben, dass zunächst Variable Deal mit der zweiten []
zurückgegeben.
Aber die beste Lösung hier (wie bereits erwähnt in eine andere Antwort ) ist die Verwendung eines anderer Operator wie []
.
Tags und Links c++ operator-overloading