9 Stimmen

operator[][] C++

Ich würde gerne überladen operator[][] um internen Zugriff auf ein 2D-Array von char in C++ zu ermöglichen.

Im Moment überlade ich nur operator[] die etwa so lautet

class Object
{
    char ** charMap ;
    char* operator[]( int row )
    {
        return charMap[row] ;
    }
} ;

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

19voto

Konrad Rudolph Punkte 503837

Versuchen Sie das nicht - wie andere schon sagten, Überlastung operator [] die Art und Weise, wie Sie es tun, bietet tatsächlich die [][] Syntax kostenlos. Aber das ist keine gute Sache.

Im Gegenteil - es zerstört die Kapselung und das Verstecken von Informationen in Ihrer Klasse, indem es ein Implementierungsdetail - die char* Zeiger - nach außen. Im Allgemeinen ist dies nicht ratsam.

Eine bessere Methode wäre die Implementierung einer operator [,] die mehr als ein Argument benötigt, oder eine operator [][] . Aber beides gibt es in C++ nicht.

Also die üblich Die beste Möglichkeit, dies zu tun, ist der Verzicht auf operator [] insgesamt für mehr als eine Dimension. Die saubere Alternative ist die Verwendung von operator () stattdessen, weil dieser Operator peut mehr als ein Argument haben:

class Object
{
    char ** charMap ;
    char& operator ()(int row, int column)
    {
        return charMap[row][column];
    }
};

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

17voto

rjh Punkte 47430

Es gibt keinen Betreiber [][] : das sind zwei [] Operationen hintereinander. Das könnten Sie:

  • Haben Object::operator[] ein Objekt einer zweiten Klasse zurückgeben, das eine Zeile darstellt, die ihre eigene operator[] Methode, die eine Spaltennummer annimmt;
  • Schreiben Sie eine get(int row, int column) Methode und verwenden Sie diese anstelle der Operatorüberladung. Ich würde dies empfehlen, es sei denn, Ihr Objekt muss sich unbedingt wie ein Array verhalten.

5voto

sth Punkte 210180

Es gibt keine operator[][] . Bewertung von a[x][y] erste Anrufe operator[] auf a und dann operator[] wieder auf das Ergebnis der Studie.

Also die operator[] Ihres Objekts muss ein anderes Objekt mit seiner eigenen operator[] die dann auf den angeforderten Wert zugreifen wird.

2voto

pajton Punkte 15290

Soviel ich weiß, gibt es keine operator[][] . Was Sie tun können, ist, dass Sie von Ihrem operator[] Methode etwas, das überlastet hat operator[] .

Eigentlich tun Sie es jetzt, weil Sie zurückkehren char* die indiziert werden können mit [] wieder.

0voto

Cam Punkte 14515

Es gibt keine [][] Betreiber. Was tatsächlich passiert, ist, dass der zweite [] arbeitet mit der Variablen, die von der ersten [] . Da es diese Funktion bereits gibt, würde es zu Unklarheiten führen, wenn es eine [][] Betreiber.

Ein Beispiel: Nehmen wir an, Sie haben eine Variable x in irgendeiner Form T .

T x = new T();

Wenn wir die [] Operator, sagen wir eine Variable eines anderen Typs Q zurückgegeben wird:

Q y = x[0];

Und dann mit der [] Operator auf eine Variable vom Typ Q könnte eine Variable des Typs R :

R z = y[0];

Deshalb x[][] gibt eine Variable des Typs R zurück.

Nehmen wir an, wir wären tatsächlich in der Lage, eine Überlastung [][] für den Typ T so, dass er einen Typ S zurückgibt:

S a = x[0][0];

Der Compiler hätte keine Möglichkeit zu wissen, ob er die [][] Betreiber von x um einen Typ zurückzugeben S Variable, oder verwenden Sie die [] Operator zweimal hintereinander, um einen Typ zurückzugeben R variabel. Dies ist die Zweideutigkeit, die ich oben erwähnt habe.

Ihr bester Tipp wenn Sie keine eckigen Klammern verwenden möchten ist zu haben operator[] eine Variable zurückgeben, die ebenfalls den [] überladen (oder vielleicht eine Variable desselben Typs mit einem gesetzten Flag), und diese anfänglich zurückgegebene Variable soll sich mit der zweiten [] .

Aber die beste Lösung ist hier (wie bereits in eine weitere Antwort ) ist die Verwendung eines anderen Operators wie () .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X