Klasse, Vererbung, static, etc....
-
Hallo Leute,
Habe folgenden Code:/*Kontoverwaltungsprogramm*/ #include <iostream> #include <string> using namespace std; class Konto { protected: float kontostand; public: Konto() { kontostand=0; }; void einzahlen(float einzahlung) { kontostand+=einzahlung; }; virtual bool darfAuszahlen(float betrag)=0; void auszahlen(float auszahlung) { if(darfAuszahlen(auszahlung)) kontostand-=auszahlung; else cout<<"Auszahlung nicht moeglich!\n"; }; virtual void anzeigen() { cout<<"Kontostand: "<<kontostand<<endl; }; virtual void jahresabschluss()=0; }; class Girokonto:public Konto { private: float ueberziehungsrahmen; public: Girokonto() { ueberziehungsrahmen=1000; }; bool darfAuszahlen(float betrag)//virtual in Konto { return betrag<=kontostand+ueberziehungsrahmen; }; void anzeigen()//virtual in Konto { Konto::anzeigen(); cout<<"Ueberziehungsrahmen: "<<ueberziehungsrahmen<<endl; }; void jahresabschluss() { kontostand-=30; }; }; class Sparkonto:public Konto { private: float zinssatz; public: Sparkonto() { static float zinssatz=0.1; }; void anzeigen()//virtual in Konto { Konto::anzeigen(); cout<<"Zinssatz: "<<zinssatz*100<<endl; }; bool darfAuszahlen(float betrag)//virtual in Konto { return betrag<=kontostand; }; void jahresabschluss() { kontostand+=kontostand*zinssatz;; }; }; void inhaberUndKontoAnzeigen(string inhaber,Konto *pKto) { cout<<"Inhaber: "<<inhaber<<endl; pKto->anzeigen(); cout<<endl; }; int main() { cout<<"Willkommen bei der GELD-Bank!"<<endl; cout<<"Ihr Girokonto:"<<endl; Girokonto g; //g.inhaberUndKontoAnzeigen(Karl,); g.einzahlen(10); //Kontostand +10 g.jahresabschluss(); //Jahresabschluss: -30 Kontostand: -20 g.auszahlen(1500); //eine Auszahlung von 1500 würde den Ueberziehungsrahmen sprengen g.auszahlen(100); //100 dagegen sind machbar Kontostand: -120 g.anzeigen(); cout<<"\nIhr Sparkonto:"<<endl; Sparkonto s; s.einzahlen(100); s.jahresabschluss(); s.auszahlen(1500); s.auszahlen(100); s.anzeigen(); system("pause"); return 0; };Ich habe folgende Fragen an euch:
Woran liegt es, dass das Programm den Zinssatz "komisch" benutzt? Ich befürchte es liegt an dem static.
Dann habe ich mal eine weitere Frage und zwar wie kann ich die Konten in einem Array verwalten?
Außerdem möchte ich den Zinssatz, den ich für das normale Sparkonto nutze auch fürs Girokonto nutzen. Habe den Tip bekommen, dass ich die Variable von Konto verdecke also ein Attribut überschreibe.Muss dazu sagen bin ziemlich neu in C++. Wäre für viele Tipps und Verbessrungsvorschläge dankbar!
twens
-
float zinssatz; public: Sparkonto() { static float zinssatz=0.1; };Das macht so keinen Sinn, da du jetzt 2 verschiedene Variablen angelegt hast (trotz gleichen Namens, nur daß die 2. in dem Konstruktor nur temporär existiert) und daher kriegst du auch komische Werte, da die Membervariable uninitialisert bleibt.
Richtig wär also:
float zinssatz; public: Sparkonto() { zinssatz=0.1; };Wenn dein Zinsatz jedoch konstant und dann noch gleich für alle Sparkonten sein soll, dann brauchst du eine statische, konstante Membervariable.
class Sparkonto { private: static const float zinssatz; public: // .. }Die Initialisierung davon mußt du dann außerhalb der Klasse machen (bei sauberer Trennung von Header und Sourcedatei eigentlich nur in der Sourcedatei - die sogenannte One-Definition-Rule (ODR)):
float Sparkonto::zinssatz = 0.1; // static hier nicht mehr angeben!!!Wenn du den gleichen Zinssatz für beide Kontenklassen haben willst (real sind die aber ja gerade unterschiedlich), dann könntest du einfach diese Variable in die Basisklasse Konto packen (dann als 'protected', damit die abgeleiteten Klassen darauf zugreifen können).
Und um ein Array von Konten anzulegen, benutze am besten die Klasse std::vector:
#include <vector> std::vector<Sparkonto> sparkonten; Sparkonto s; s.einzahlen(42); sparkonten.push_back(s);Diese Klasse schau dir am besten mal in einem Tutorial oder in deinem Lernbuch an-)
-
1Hallo,
hab gerade diese Eintrag gesehn. Hab noch nicht so den Plan von C++. Wollte mir dieses Programm aber mal ansehn.
Im main-menü gibt es das//g.inhaberUndKontoAnzeigen(Karl,);Und darüber
void inhaberUndKontoAnzeigen(string inhaber,Konto *pKto) { cout<<"Inhaber: "<<inhaber<<endl; pKto->anzeigen(); cout<<endl; };Wie genau benutz ich das denn, dass es funktioniert? Also welche Attribute setz ich ein?
-
Das diese als freie Funktion implementiert wurde, mußt du sie so aufrufen:
Girokonto g; inhaberUndKontoAnzeigen("Karl", &g);Wobei ich persönlich eher eine "const-reference" als Übergabeparameter bei der Definition benutzt hätte.
-
Eine Konstante Referenz würde sich bei diesem Call eher anbieten, das ist intuitiver.
-
So Leute,
hab mir die Tipps von Th69 mal angeguckt hab aber noch leichte Probleme bei der Umsetzung. Bezogen auf den Zinssatz hatte ich schon vor den mit static festzulegen. Hab folgendes gemacht:
In der Klasse:class Sparkonto:public Konto { private: //float zinssatz; static const float zinssatz; public: /*Sparkonto() { static float zinssatz=0.1; };*/Hab die Sachen die ich meiner Meinung nach nicht mehr benötige als Kommentar erstmal gelassen.
Im main Programm hab ich folgendes:int main() { float Sparkonto::zinssatz = 0.1Bekomm jetzt aber vom Compiler:
In functionint main()': error: conflicting declaration 'float Sparkonto::zinssatz' error: 'Sparkonto::zinssatz' has a previous declaration asconst float Sparkonto::zinssatz'
So bin jetzt etwas irritiert, weil ich doch irgendwie den Zinssatz festlegen muss.Dann bin ich noch unsicher in dem Umgang mit dem Array:
Und zwar wird mir nicht ganz klar, wie ich mit dem von Th69 geposteten Array die Konten verwalten kann. Brauche ich außerdem noch ein extra Array für die Girokonten?Falls ich etwas wichtiges aus dem Programm nicht gepostet habe müsste man es im ersten Beitrag sehen können.
twens
-
Du musst das
constbei der Definition vonzinssatzauch angeben. Ausserdem würde ich statische Variablen in der Implementierungsdatei der Klasse und nicht inmain()definieren.
-
Hab das mit dem static hinbekommen. Kann sich bitte noch einmal jemand meine Frage zu dem Array angucken?
-
Für dich als Anfänger empfehle ich ersteinmal getrennte Arrays für die verschiedenen Konten.
Wenn du danach dann ein gemeinsames Array benutzen willst, kommst du um "Polymorphie" nicht herum, d.h. du mußt Zeiger in dem std::vector verwalten:
std::vector< Konto* > vecKonten;(wenn du boost oder aber eine neuere Lib mit TR1-Unterstützung hast, kannst du dann auch shared_ptr verwenden - dann brauchst du dich um die Freigabe nicht mehr zu kümmern)
Aber ersteinmal alles der Reihe nach...
-
Th69 schrieb:
float zinssatz; public: Sparkonto() { static float zinssatz=0.1; };Das macht so keinen Sinn, da du jetzt 2 verschiedene Variablen angelegt hast (trotz gleichen Namens, nur daß die 2. in dem Konstruktor nur temporär existiert) und daher kriegst du auch komische Werte, da die Membervariable uninitialisert bleibt.
Nicht temporär, die ist static und überlebt damit den ersten Konstruktoraufruf und wird bei allen anderen nicht mehr initialisiert (static halt).
Sie existiert aber nur lokal im Konstruktor, du kannst nur dort darauf zugreifen.