Array von Zeigern / Polymorphie
-
Hi,
ich soll eine kleines Programm schreiben, mit einer Oberklasse Konto mit Methoden wie Einzahlung etc.
Dann gibt es zwei weitere Kontoarten wie Giro- und Festgeldkonto welche von der Klasse Konto erben.Diese Klassen sind bereits in größtenteilen fertig geschrieben.
Allerdings komme ich mit einer Teilaufgabe nicht weiter, da ich nicht weiß, wie ich das anstellen soll. Im Menü gibt es einen Punkt mit dem ich die verschiede Konten anlegen kann.
Aufgabe:
"Konten sollen gespeichert werden, indem ein Array von Zeigern auf Konten verwendet wird und durch Polymorphie auf die jeweilige Methoden der entsprechenden Kontoarten verwiesen wird."Evt. kann mir einer bei diesem Teil helfen.
Gruß
Krikus
-
Hast du denn zu dieser Teilaufgabe schon etwas gemacht, wo du eventuell Fragen hast?Weil Hausaufgaben machen wir hier nicht
Nur wer Eigenintiative zeigt, bekommt Hilfe.
-
Speichere einfach Zeiger auf die Basisklasse "Konto". Die Ein/Auszahlungen sollten ja abstrakte Funktionen sein, dann spielt es keine Rolle, ob es ein Giro, oder ein Festgeldkonto ist. Es wird dann automatisch die Funktion der abgeleiteten Klasse aufgerufen.
class Konto { public: virtual void einzahlung (int Geld ) = 0; virtual int auszahlung () = 0; } class Giro : public Konto { public: void einzahlung (int Geld) {...} int auszahlung () {...} } class Festgeld : public Konto { public: void einzahlung (int Geld) {...} int auszahlung () {...} } Konto*[ 10 ] konten; // platz für 10 Konten konten[ 0 ] = new Giro (); konten[ 1 ] = new Festgeld (); ... for (int i = 0; i < 10 ; i++ ) konten[ i ]->einzahlung ( 100000000000 ); // schön wärs, wenns so einfach wäre :p
-
Besten Dank dragkon für deine Antwort.
Genau den unteren Teil Codes habe ich gebraucht.Allerdings mag mein Compiler diese Zeile nicht:
basisklasse_konto*[ 10 ] konten; // platz für 10 Konten<- syntax error : '['
-
so ists richtigrum:
Konto* konten[ 10 ];bb
-
In C++ müssen die []-Klammern bei Arraydeklarationen nach dem Bezeichner stehen:
basisklasse_konto* konten[10];
-
Eventuell kann man an dieser Stelle noch die Standardcontainer erwähnen. Wie
std::vectorstd::vector<BasisKlasse*> klassen; klassen.push_back(new Giro);Dazu muss man aber auch noch sowas wie,
boost::shared_ptrundboost::ptr_listund Konsorten erwähnen.edit:Was ich vergessen habe, wenn du keine Boost-Variante verwenden willst, denk bitte an die Regel:
Für jedes new ein delete
-
Firefighter schrieb:
Dazu muss man aber auch noch sowas wie,
boost::shared_ptrundboost::ptr_listund Konsorten erwähnen.Muss man auf jeden Fall.

Vielleicht wäre hilfreich, zu sagen, dass die Smart Pointer und Pointer Container vor allem benötigt werden, um eine automatische Freigabe sicherzustellen. Container mit
newunddeletesind nämlich relativ anfällig auf Memory Leaks.
-
Danke für den Zusatz, Nexus
