Referenz und "this" -GELÖST-
-
#include <iostream> using namespace std; class Kunde { public: int Alter; int Einkommen; int Postleitzahl; //Prototypen void AlterSpeichern(Kunde &obj); //Übergabe per Referenz void EinkommenSpeichern(Kunde *obj); //Übergabe per Zeiger void AlterAusgebenUndPLZSpeichern(); //Gibt Alter aus und ruft "PostleitzahlSpeichern" auf. void PostleitzahlSpeichern(Kunde *obj); //Übergabe per Zeiger }; int main() { Kunde Neu; Neu.AlterSpeichern(Neu); //Alter speichern Neu.EinkommenSpeichern(&Neu); //Einkommen speichern cout<<"Einkommen: "<<Neu.Einkommen<<endl; //Einkommen ausgeben Neu.AlterAusgebenUndPLZSpeichern(); //Alter ausgeben und PLZ speichern cout<<"PLZ: "<<Neu.Postleitzahl<<endl; //PLZ speichern return 0; } //Definitionen der Funktionen //Übergabe per Referenz void Kunde::AlterSpeichern(Kunde &obj) { obj.Alter=100; } //Übergabe mittels Zeiger void Kunde::EinkommenSpeichern(Kunde *obj) { obj->Einkommen=200; } //Übergabe mittels Zeiger void Kunde::PostleitzahlSpeichern(Kunde *obj) { obj->Postleitzahl=99999; } //Gibt das Alter aus und ruft "PostleitzahlSpeichern()" auf. void Kunde::AlterAusgebenUndPLZSpeichern() { cout<<"Alter: "<<this->Alter<<endl; PostleitzahlSpeichern(this); }
Ich möchte bei der Funktion "PostleitzahlSpeichern()" das Objekt gerne per Referenz übergeben, also z.B.
void Kunde::PostleitzahlSpeichern(Kunde &obj) { obj.Postleitzahl=99999; }
Wie muss ich dann aber die Funktion "AlterAusgebenUndPLZSpeichern()" schreiben?
-
PostleitzahlSpeichern(*this);
Das *this, macht, dass man aus dem this-Zeiger wieder das zugehörige Objekt erhält, was man dann übergeben kann. Das vorgestellte this-> ist in Klassenmethoden sowieso immer implizit und kann weggelassen werden, wenn man es nicht braucht, um Uneindeutigkeiten zu klären.Zwei Anmerkungen noch:
1. Ich hoffe das ist nur ein Test, um mal alle Möglichkeiten auszuprobieren.
2. Ein arithmetischer Datentyp wie int ist ein denkbar ungeeignet für eine Postleizahl. In der Alltagssprache nennt man es zwar Zahl, aber technisch gesehen ist es eine Ziffernfolge. Schließlich kann man mit Postleitzahlen nicht sinnvoll rechnen.
-
SeppJ schrieb:
int ist ein denkbar ungeeignet für eine Postleizahl
Kann ich bestätigen.
Für Oelsnitz bekomme ich sogar einen Compilerfehler.
-
SeppJ schrieb:
PostleitzahlSpeichern(*this);
Ok, danke für den Tip.
SeppJ schrieb:
Zwei Anmerkungen noch:
1. Ich hoffe das ist nur ein Test, um mal alle Möglichkeiten auszuprobieren.Ja.
SeppJ schrieb:
2. Ein arithmetischer Datentyp wie int ist ein denkbar ungeeignet für eine Postleizahl. In der Alltagssprache nennt man es zwar Zahl, aber technisch gesehen ist es eine Ziffernfolge. Schließlich kann man mit Postleitzahlen nicht sinnvoll rechnen.
Ok.
-
volkard schrieb:
SeppJ schrieb:
int ist ein denkbar ungeeignet für eine Postleizahl
Kann ich bestätigen.
Für Oelsnitz bekomme ich sogar einen Compilerfehler.Komischer Compiler.
Postleitzahl=9376;
-
tütütüdü...aaaaaa schrieb:
volkard schrieb:
SeppJ schrieb:
int ist ein denkbar ungeeignet für eine Postleizahl
Kann ich bestätigen.
Für Oelsnitz bekomme ich sogar einen Compilerfehler.Komischer Compiler.
Postleitzahl=9376;Die korrekte PLZ lautet 09376.
-
Aber ist es nicht so, dass er eigentlich alle
this
, alle Objekte in den Methoden und alle Übergabeparameter in den Memberfunktionen weglassen kann, da es in diesem Fall sowieso nur auf die Member der eigenen Klasse zugegriffen wird..?
-
[Rewind] schrieb:
Aber ist es nicht so, dass er eigentlich alle
this
, alle Objekte in den Klassen und alle Übergabeparameter in den Memberfunktionen weglassen kann, da es in diesem Fall sowieso nur auf die Member der eigenen Klasse zugegriffen wird..?Jain. Technisch gesehen kann er nur das this-> in Zeile 50 weglassen. Vom Sinn her gesehen ist es im Rest des Programmes natürlich grober Unfug, nichtstatische Memberfunktionen zu haben die ein übergebenes Objekt ändern.