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?


  • Mod

    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..?


  • Mod

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


Log in to reply