operator [] [] C ++

8

Ich möchte operator[][] überladen, um internen Zugriff auf ein 2D-Array von Zeichen in C ++ zu geben.

Im Moment übertreibe ich nur operator[] , was ungefähr so ​​aussieht wie

%Vor%

Es funktioniert ok. Ist es möglich, operator[][] zu überschreiben?

    
bobobobo 28.03.2010, 14:29
quelle

5 Antworten

18

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:

%Vor%

Weitere Informationen finden Sie im Artikel in der C ++ - FAQ Lite .

    
Konrad Rudolph 28.03.2010, 14:52
quelle
17

Es gibt keinen Operator [][] : das sind zwei [] -Operationen in einer Zeile. Du könntest:

  • Lassen Sie Object::operator[] ein Objekt einer zweiten Klasse zurückgeben, das eine Zeile darstellt, die ihre eigene Methode operator[] hat, die eine Spaltennummer annimmt;
  • Schreiben Sie eine 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.
rjh 28.03.2010 14:34
quelle
5

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.

    
sth 28.03.2010 14:33
quelle
2

Soweit ich weiß, gibt es keine operator[][] . Was Sie tun können, ist, dass Sie von Ihrer operator[] -Methode etwas zurückgeben könnten, das operator[] überladen hat.

Tatsächlich machst du es jetzt, weil du char* zurückbringst, das wieder mit [] indexiert werden kann.

    
pajton 28.03.2010 14:34
quelle
0

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 .

%Vor%

Wenn wir den Operator [] verwenden, sagen wir, dass eine Variable vom anderen Typ Q zurückgegeben wird:

%Vor%

Wenn Sie dann den Operator [] für eine Variable vom Typ Q verwenden, wird möglicherweise eine Variable vom Typ R :

zurückgegeben %Vor%

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:

%Vor%

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 [] .

    
Cam 28.03.2010 15:11
quelle

Tags und Links