Frage zum Überladen eines Operators
-
Hallo zusammen,
ich habe ein Problem bezüglich dem Überladen von Operatoren. Ich habe ein kleines Programm geschrieben, in welchem der Operator + überladen wird. Ich habe versucht ihm die Bedeutung des Subtrahierens zuzuweisen. So sieht es aus:class CKlasse { public: CKlasse(int); void SetzeSeiten(int); int operator+(CKlasse); private: int laenge; }; CKlasse::CKlasse(int zahl) { SetzeSeiten(zahl); } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- int CKlasse::operator+(CKlasse Objekt) { return (this->laenge - Objekt.laenge); } //--------------------------------------------------------------------------- void CKlasse::SetzeSeiten(int Zahl) { laenge=Zahl; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { CKlasse a(4); CKlasse b(3); int ergebnis=a+b; ShowMessage(String(ergebnis)); }
Das Programm funktioniert, doch bleiben ein paar Fragen.
1.) Ich habe versucht, die Selbstreferenz "this" zu entfernen, doch bin ich kläglich gescheitert. So sah es bei mir aus:
//In der Klassendeklaration: int operator+(CKlasse, CKlasse); //Definition des Operators: int CKlasse::operator+(CKlasse Objekt, CKlasse Objekt1 { return (Objekt.laenge - Objekt1.laenge); } //Aufruf des Operator (war mir nicht sicher): CKlasse a(4); CKlasse b(3); int ergebnis=a+b; //gleich
Dabei kommen folgende Fehler:
'CKlasse::operator +(CKlasse,CKlasse)' muß mit einem Parameter deklariert werden
'operator+' ist im Typ 'CKlasse' für Argumente desselben Typs nicht implementiertWas muss ich ändern?
2.) Wenn ich eine Operator überladen, kann ich dies immer nur für die jeweilige Bezugsklasse machen oder könnte das Pluszeichen so ändern, das es bei jedem Aufruf, egal wo, subtrahiert?
Vielen Dank für eure Hilfe
lg, freakC++
-
Ich denke, die Überladung von Operatoren ist nur für die jeweilige Klasse möglich.
Ist auch richtig so. - Du kannst ja auch nicht Kaffee mit Cola addieren.Den this-Zeiger müsstest du eigentlich weg lassen können.
int CKlasse::operator+(CKlasse Objekt) { return (laenge - Objekt.laenge); }
So solltest du es eigentlich auch ansprechen können. "laenge" wäre ja dann in diesem Fall die Länge des aufrufenden Objektes.
-
Hallo,
ok, ich habe meine Frage etwas falsch formuliert. Ich wollte wissen, ob ich das Programm so umschreiben kann, dass ich zwei Objekte als parameter übergeben kann. Außerdem würde ich gerne wissen, was eigentlich das "aktive" Objekt bei diesem Programm ist. Ist es das, was genau vor dem überladenen Operator steht oder auf welches Objekt zeigt this hier?Vielen Dank
lg, freakC++
-
this zeigt auf das Objekt links vom Operator. Aus diesem Grund hat der Operator auch nur ein Paramter und zwar das Objekt rechts von der Klasse.
Das was du willst ist den Operator komplett außerhalb der Klasse definieren, dann braucht er zwei Objekte als Parameter, weil ja sonst das eine Bezugobjekt fehlt.//als Methode: Klasse Klasse::operator+(Klasse rechts) { return *this + rechts; } // als globale Funktion: Klasse operator+(Klasse links, Klasse rechts) { return links + rechts; }
P.S den Additions-Op mit einer Subtraktion zu implementieren ist nicht sinnvoll
-
Hallo,
vielen Dank! Habs kapiert!lg, freakC++
PS.:Ich weiß, dass das nicht sinnvoll ist
-
Ich würde vorschlagen, hier die Parameter als konstante Referenzen zu übergeben um unnötige Kopien zu vermeiden.