Häufiges Konto-Beispiel, Überweisung von KontoA nach KontoB funktioniert nicht!



  • Hallo,
    vielleicht kann hier jemand helfen, es geht um ein häufiges Beispiel, was man in der Literatur über OOP aufgreift, das Konto-Beispiel.

    Leider funktioniert die Überweisung bei mir nicht, das Konto1 hat den korrekten Kontostand von 50 , allerdings verändert sich der Kontostand2 nicht (auf gewollte 5050).

    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    //____________________________Basisklasse Konto_________________________________
    class Konto
    {
          protected:
            int iKontonummer;
            float fKontostand;
    
          public:
            void Konto_Anzeigen();
            void Konto_Bearbeiten();
            void Konto_Loeschen();  
            void Konto_Einzahlen(float fBetrag);
            void Konto_Auszahlen(float fBetrag);
            void Konto_Ueberweisen(Konto zielkonto, float fBetrag); 
            float Konto_Kontostand();  
    
            Konto(int i1, float f1) {iKontonummer = i1; fKontostand = f1;}
            Konto();
    };
    
    void Konto::Konto_Anzeigen()
    {
         cout << "Kontonummer: " << iKontonummer << endl;
         cout << "Kontostand: " << fKontostand << endl;
    }
    
    void Konto::Konto_Bearbeiten()
    {
         cout << "Kontonummer: " << iKontonummer << endl;
         cout << "Kontonummer: " ;
         cin >> iKontonummer;
    }
    
    void Konto::Konto_Loeschen()
    {
         iKontonummer =0;
         fKontostand = 0.0;
    }
    
    void Konto::Konto_Einzahlen(float fBetrag)
    {
         if (fBetrag>=0)
         { 
              fKontostand = fKontostand + fBetrag;                             
         }
         else;
    }
    
    void Konto::Konto_Auszahlen(float fBetrag)
    {
         if (fBetrag>=0)
         { 
              fKontostand = fKontostand - fBetrag;                             
         }
         else;
    }
    
    void Konto::Konto_Ueberweisen(Konto zielkonto, float fBetrag)
    {
       Konto_Auszahlen(fBetrag);
       zielkonto.Konto_Einzahlen(fBetrag);
    }
    
    float Konto::Konto_Kontostand()
    {
          return fKontostand;
    }
    
    int main()
    {
     Konto Konto1(411553, 100);
     Konto Konto2(411552, 5000);
    
     cout << "Vor der Ueberweisung:" << endl;
     Konto1.Konto_Anzeigen();
     Konto2.Konto_Anzeigen();
     Konto1.Konto_Ueberweisen(Konto2, 50);
    
     cout << endl << endl<< "Nach der Ueberweisung: (Es sollen 50 euro von Konto1 nach Konto 2 ueberwiesen werden)" << endl;
    
     Konto1.Konto_Anzeigen();
     Konto2.Konto_Anzeigen();
    
        system("PAUSE");
    }
    

    Wenn man dieMethode Überweisung um eine Ausgabe erweitert

    void Konto::Konto_Ueberweisen(Konto zielkonto, float fBetrag)
    {
       Konto_Auszahlen(fBetrag);
       zielkonto.Konto_Einzahlen(fBetrag);
       zielkonto.Konto_Anzeigen();
    }
    

    erhält man in dieser lokalen Ausgabe den richtigen Wert von 1050.
    Dieser verändert sich jedoch wieder (UND DAS IST DAS PROBLEM) beim Aufruf von

    Konto2.Konto_Anzeigen();
    

    Vielleicht hat jemand einen Tipp, wofür ich sehr dankbar wäre!



  • Du übergibst eine KOPIE des Kontos an die Methode (call-by-value). Stattdessen musst du eine Referenz auf das Objekt (Konto) übergeben (call-by-reference).

    Die Methode muss also so aussehen:

    void Konto_Ueberweisen(Konto& zielkonto, float fBetrag);
    

  • Mod

    void Konto::Konto_Ueberweisen(Konto &zielkonto, float fBetrag)
    {
       Konto_Auszahlen(fBetrag);
       zielkonto.Konto_Einzahlen(fBetrag);
    }
    

    Erklärung: Das & sorgt dafür dass das Zielkonto als sogenannte Referenz (Begriff nachschlagen um mehr zu lernen) übergeben wird, ansonsten wird beim Aufruf von Konto::Konto_Ueberweisen eine Kopie von zielkonto angelegt und deren Wert verändert. Beim Verlassen der Funktion wird diese veränderte Kopie zerstört und das Programm arbeitet mit dem unveränderten Original weiter. Bei der Übergabe als Referenz arbeitet die Methode mit dem Originalobjekt.

    edit: Immer bin ich zu spät, ich muss echt mal schneller Tippen.



  • Danke, es klappt!
    Vielen Dank für die schnelle Hilfe!

    Ja, hätte ich im Unterricht beim Thema Zeiger etwas besser aufpassen müssen 🙄



  • brightknight schrieb:

    Danke, es klappt!
    Vielen Dank für die schnelle Hilfe!

    Ja, hätte ich im Unterricht beim Thema Zeiger etwas besser aufpassen müssen 🙄

    Referenzen und Zeiger sind nochmal was anderes (wenn auch ähnlich). Am besten du liest dir das hier mal durch:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-124532-and-sid-is-020003572b5b5b7eeb85ba841efd46f4.html


Anmelden zum Antworten