2016-10-26 8 views
-4

Ich versuche, den Operator [] zu überlasten. Ich erhalte einen unbehandelten Ausnahmefehler. Ich implementiere eine Matrix-Klasse mit einem vector<double>.C++ überladen Operator Stapelüberlauf

double& Matrix::operator[](int i) 
{ 
    return (*this)[i]; 
} 
+13

Erkläre, was das mit deiner [Gummiente] (https://en.wikipedia.org/wiki/Rubber_duck_debugging) macht: '(* this) [i]'. – juanchopanza

+0

Sieht aus wie eine Rekursion. – Archie

+0

Sollten Matrizen nicht mehr als eine Dimension haben? –

Antwort

2

(*this) kehrt Ihr Matrix Objekt. Daher ruft (*this)[i]Matrix::operator[](i). Ihre Funktion ruft sich ohne Abschlussbedingungen, die ähnlich wie diese:

int foo() { 
    return foo(); 
} 

, die, wie man sich vorstellen kann, wird ziemlich schnell zum Absturz bringen.

Sie möchten möglicherweise std::vector::operator[] von einer Mitgliedsvariablen aufrufen. Zum Beispiel, wenn Ihre Klasse einen privaten Vektorobjekt vec genannt hat, möchten Sie vielleicht tun:

double& Matrix::operator[](int i) 
{ 
    return this->vec[i]; 
} 

Auch ist this->member Abkürzung für (*this).member, verwenden Sie es öfter!

1

(*this)[i] ist funktionell äquivalent zu (*this).operator[](i).

Es ruft daher Matrix::operator[](i). Da dies innerhalb der Operatorfunktion selbst geschieht, ruft sich die Funktion bedingungslos rekursiv auf. Dies bedeutet, dass es sich selbst weiter anruft, bis die Speicherkapazität erschöpft ist, was - auf einigen Systemen - zu einer Systemausnahme führt.

Matrix Unter der Annahme, hat ein Mitglied des Typs std::vector<double>, werden Sie wahrscheinlich that_member[i] verwenden müssen (was die Vektors nennt operator[]) statt (*this)[i].