*Bankkonto*: Verweis auf ein Objekt anderer Klasse richtig übergeben? Keine Ausgabe!
-
@Th69 sagte in *Bankkonto*: Verweis auf ein Objekt anderer Klasse richtig übergeben? Keine Ausgabe!:
Und noch ein anderer genereller Fehler ist in der Programm-Logik:
void Bank::menu() { Bank bank1;
Um diese Funktion aufzurufen, mußt du doch schon ein
Bank
-Objekt anlegen, erzeugst dann aber ein weiteres lokalesBank
-Objektbank1
, für das du die weiteren Funktionen aufrufst, so daß nach Verlassen diesermenu
-Funktion alle Daten verworfen sind!
Diemenu
-Funktion gehört auch nicht in dieBank
-Klasse, sondern sollte eigenständig sein (Klassen der Logik-Schicht sollten keine direkte Ein- oder Ausgabe besitzen).Nein, die
menu
-Funktion soll in der Klasse drinne sein. Das ist vorgegeben.
DasBank
-Objekt lege ich mit Beginn dermenu
-Funktion an, damit dort im Prozess der Benutzereingabe sämtliche Daten dort gespeichert werden.@It0101 sagte in *Bankkonto*: Verweis auf ein Objekt anderer Klasse richtig übergeben? Keine Ausgabe!:
Nach meiner Logik her, würde ich Personen und Accounts in getrennten Klasse verwalten. Das eine hat mit dem anderen ja prinzipiell nichts zu tun bzw. Funktionen der Account-Klasse ändern nie Personendaten, sondern fragen sie höchstens ab.
D.h. ich würde ich eine Klasse für die Personen machen, mit den notwendigen Funktionen ( erzeugen, löschen, abfragen ):
class Personenverwaltung { public: Personenverwaltung(); ~Personenverwaltung(); void createPerson( const std::string &vorname, const std::string &nachname ); void removePerson( const std::string &vorname, const std::string &nachname ); bool personBekanntName( const std::string &vorname, const std::string &nachname ) const; bool personBekanntId( unsigned personenid ) const; // ..... etc. };
Und dann eine Klasse Kontenverwaltung
class Kontenverwaltung { public: Kontenverwaltung( const Personenverwaltung & ); ~Kontenverwaltung(); void createAccount( const std::string &vorname, const std::string &nachname ); void removeAccount( const std::string &vorname, const std::string &nachname ); };
Die Kontenverwaltung kennt somit alle Personen, kann aber lediglich Informationen zu den Personen abfragen und nichts ändern. Somit sind die eigentlichen Banking-Funktionalitäten sauber getrennt von den Personendaten.
Nur als genereller Vorschlag von mir.
Personen, Accounts und Bank sind in jeweils getrennten Klassen
-
@Suprax sagte in *Bankkonto*: Verweis auf ein Objekt anderer Klasse richtig übergeben? Keine Ausgabe!:
Nein, die
menu
-Funktion soll in der Klasse drinne sein. Das ist vorgegeben.Das ist trotzdem schlechtes Design und es sollte dein Bestreben sein, es korrekt zu machen. Die Klassen sollten der Wirklichkeit folgen, sonst bekommst du später komische Effekte (Oder auch jetzt sofort, denn dein Fragen sind Folgen von mittelmäßigem Design). Echte Banken haben Menüs höchsten in der Kantine. Banken haben auch keine Computerschnittstelle zum Bedienen einer Bankingsimulation. Banken haben keine Personen, sondern ein Personenverzeichnis. Wer aber Personen und Banken und eine Computerschnittstelle zur Bankingsimulation hat, wäre beispielsweise ein Bankingsimulator. Das sollte eine Klasse bei dir sein, in deren Instanzen dann Banken und Personen existieren, deren Zusammenspiel über die Schnittstelle gesteuert wird.
Das
Bank
-Objekt lege ich mit Beginn dermenu
-Funktion an, damit dort im Prozess der Benutzereingabe sämtliche Daten dort gespeichert werden.Du hast das Problem gar nicht verstanden. Die menu-Funktion ist bei dir schon Teil einer Bank. Du hast ein Bank in deiner Bank erzeugt.
-
Ich bin mittlerweile voran gekommen und fast fertig.
Allerdings muss ich jetzt die Buchungen, die der Benutzer tätigen kann, zeitlich ordnen.
Die Zeitangabe, wann die Buchungen statt finden, entscheidet der Benutzer selbst.
Habt ihr eine Idee wie ich die am besten sortiert bekomme?@SeppJ sagte in *Bankkonto*: Verweis auf ein Objekt anderer Klasse richtig übergeben? Keine Ausgabe!:
@Suprax sagte in *Bankkonto*: Verweis auf ein Objekt anderer Klasse richtig übergeben? Keine Ausgabe!:
Nein, die
menu
-Funktion soll in der Klasse drinne sein. Das ist vorgegeben.Das ist trotzdem schlechtes Design und es sollte dein Bestreben sein, es korrekt zu machen. Die Klassen sollten der Wirklichkeit folgen, sonst bekommst du später komische Effekte (Oder auch jetzt sofort, denn dein Fragen sind Folgen von mittelmäßigem Design). Echte Banken haben Menüs höchsten in der Kantine. Banken haben auch keine Computerschnittstelle zum Bedienen einer Bankingsimulation. Banken haben keine Personen, sondern ein Personenverzeichnis. Wer aber Personen und Banken und eine Computerschnittstelle zur Bankingsimulation hat, wäre beispielsweise ein Bankingsimulator. Das sollte eine Klasse bei dir sein, in deren Instanzen dann Banken und Personen existieren, deren Zusammenspiel über die Schnittstelle gesteuert wird.
Das
Bank
-Objekt lege ich mit Beginn dermenu
-Funktion an, damit dort im Prozess der Benutzereingabe sämtliche Daten dort gespeichert werden.Du hast das Problem gar nicht verstanden. Die menu-Funktion ist bei dir schon Teil einer Bank. Du hast ein Bank in deiner Bank erzeugt.
@SeppJ Ich kann da leider bzgl. der
menu
-Funktion nichts machen. Sie muss so implementiert werden, wie es vorgegeben wurde. Ich bin nicht der ProfDu hast das Problem gar nicht verstanden. Die menu-Funktion ist bei dir schon Teil einer Bank. Du hast ein Bank in deiner Bank erzeugt.
Hmm. Indem ich zusätzlich ein Objekt der Klasse Bank in der Klasse Bank erzeugt habe, habe ich eine Bank in meiner Bank erzeugt?
-
@Suprax sagte in *Bankkonto*: Verweis auf ein Objekt anderer Klasse richtig übergeben? Keine Ausgabe!:
Ich bin mittlerweile voran gekommen und fast fertig.
Allerdings muss ich jetzt die Buchungen, die der Benutzer tätigen kann, zeitlich ordnen.
Die Zeitangabe, wann die Buchungen statt finden, entscheidet der Benutzer selbst.
Habt ihr eine Idee wie ich die am besten sortiert bekomme?Bitte stell konkrete Fragen! Möchtest du wissen, wie man generell sortiert? Wonach du sortieren sollst? Wie du Zeiten im speziellen sortieren kannst? Möchtest du tatsächlich wissen, ob jemand anderes das weiß? Das sind schon einmal vier unterschiedliche Interpretationen deiner schwammigen Frage und ich und andere haben gewiss keine Lust, alle Möglichkeiten zu beantworten, in der Hoffnung, dass eine der Antworten dir vielleicht helfen könnte. Siehe:
https://www.c-plusplus.net/forum/topic/200753/du-brauchst-hilfe@SeppJ Ich kann da leider bzgl. der
menu
-Funktion nichts machen. Sie muss so implementiert werden, wie es vorgegeben wurde. Ich bin nicht der ProfDu hast das Problem gar nicht verstanden. Die menu-Funktion ist bei dir schon Teil einer Bank. Du hast ein Bank in deiner Bank erzeugt.
Hmm. Indem ich zusätzlich ein Objekt der Klasse Bank in der Klasse Bank erzeugt habe, habe ich eine Bank in meiner Bank erzeugt?
Ja! Und kommt dir das nicht komisch falsch vor? Du scheinst nach wie vor nicht so ganz verstanden zu haben, was Objekte, Klassen, etc. überhaupt sind. Lern' mal mehr nach deinem Stroustrup-Buch und weniger nach deinem Prof!
Ich kann da leider bzgl. der menu-Funktion nichts machen. Sie muss so implementiert werden, wie es vorgegeben wurde. Ich bin nicht der Prof
Klar! Bloß keine Eigeninitiative zeigen oder Wissen aneignen, das über die Vorlesung hinaus geht. Wo kämen wir denn da hin, wenn Studenten plötzlich anfingen, mehr als nur die Mindestleistung zum Bestehen zu erbringen?
-
@Suprax sagte in [*Bankkonto*: Verweis auf ein Objekt anderer Klasse richtig übergeben? Keine Ausgabe!]
Personen, Accounts und Bank sind in jeweils getrennten Klassen
scheinbar nicht, oder was tut der "Person"-Vector in deiner Bankklasse?
class Bank { private: vector<Person> person; vector<Account> account; };
-
@SeppJ sagte in *Bankkonto*: Verweis auf ein Objekt anderer Klasse richtig übergeben? Keine Ausgabe!:
@Suprax sagte in *Bankkonto*: Verweis auf ein Objekt anderer Klasse richtig übergeben? Keine Ausgabe!:
Ich bin mittlerweile voran gekommen und fast fertig.
Allerdings muss ich jetzt die Buchungen, die der Benutzer tätigen kann, zeitlich ordnen.
Die Zeitangabe, wann die Buchungen statt finden, entscheidet der Benutzer selbst.
Habt ihr eine Idee wie ich die am besten sortiert bekomme?Bitte stell konkrete Fragen! Möchtest du wissen, wie man generell sortiert? Wonach du sortieren sollst? Wie du Zeiten im speziellen sortieren kannst? Möchtest du tatsächlich wissen, ob jemand anderes das weiß? Das sind schon einmal vier unterschiedliche Interpretationen deiner schwammigen Frage und ich und andere haben gewiss keine Lust, alle Möglichkeiten zu beantworten, in der Hoffnung, dass eine der Antworten dir vielleicht helfen könnte. Siehe:
https://www.c-plusplus.net/forum/topic/200753/du-brauchst-hilfe@SeppJ Ich kann da leider bzgl. der
menu
-Funktion nichts machen. Sie muss so implementiert werden, wie es vorgegeben wurde. Ich bin nicht der ProfDu hast das Problem gar nicht verstanden. Die menu-Funktion ist bei dir schon Teil einer Bank. Du hast ein Bank in deiner Bank erzeugt.
Hmm. Indem ich zusätzlich ein Objekt der Klasse Bank in der Klasse Bank erzeugt habe, habe ich eine Bank in meiner Bank erzeugt?
Ja! Und kommt dir das nicht komisch falsch vor? Du scheinst nach wie vor nicht so ganz verstanden zu haben, was Objekte, Klassen, etc. überhaupt sind. Lern' mal mehr nach deinem Stroustrup-Buch und weniger nach deinem Prof!
Ich kann da leider bzgl. der menu-Funktion nichts machen. Sie muss so implementiert werden, wie es vorgegeben wurde. Ich bin nicht der Prof
Klar! Bloß keine Eigeninitiative zeigen oder Wissen aneignen, das über die Vorlesung hinaus geht. Wo kämen wir denn da hin, wenn Studenten plötzlich anfingen, mehr als nur die Mindestleistung zum Bestehen zu erbringen?
-
Ich möchte Buchungen sortieren, die zeitlich vorher festgelegt werden.
Das Datum initalisiere ich mit denParametern: int tag, int monat, int jahr
.
Die Buchungen sollen aufsteigend sortiert werden.
Bubble Sort könnte man hierbei benutzen, wenn ich mich nicht irre. -
Danke für die bisherige Hilfe, aber anscheinend hast du nicht verstanden warum ich mich konkret an die Vorgaben des Professor halten will.
Ich erkläre es nochmal: Es ist pflicht.
Die Altklausuren geben den Klassenaufbau, Methoden und Implementierung der Methoden vor. Ich kann nicht anfangen eine eigene Klasse für diemenu()
-Funktion zu implementieren.
Nicht, weil ich es nicht kann, sondern weil das abweicht von den Vorgaben.
Selbst wenn ich es so machen würde und das Programm kompiliert fehlerfrei und funktioniert darüber hinaus auch noch würde ich nicht nur ein Teil bis garkeine Punkte für die jeweilige Aufgabe bekommen.
Ich zeige Eigeninitiative, sonst wäre ich nicht hier und würde um Hilfe bitten. Es liegt nicht daran, dass ich sonst nicht durch die Prüfung komme.
Ich kann jetzt die Prüfung schreiben, Klassen implementieren, paar Methoden schreiben und komme mit einer guten 3, vielleicht auch 2 durch die Prüfung.
Aber das ist nicht das was ich möchte.
Ihr merkt doch selber, dass ich gewisse Dinge nicht verinnerlicht und viele Lücken habe, aber vergiss nicht, dass ich erst angefangen habe und noch auf keinem hohen Niveau bin.
Ich bin auch kein Einstein und brauche Zeit und eindeutige Erklärungen, aber wenn ich einmal etwas verstanden habe, dann bleibt das auch in meinem Kopf.- Zu der Bank-Objekt-Problematik: Wenn ich kein Objekt in der Klasse erzeuge, wo soll ich dann die dementsprechende Benutzer-Eingaben, die in der Methode
menu()
statt finden, speichern?
@It0101 sagte in *Bankkonto*: Verweis auf ein Objekt anderer Klasse richtig übergeben? Keine Ausgabe!:
@Suprax sagte in [*Bankkonto*: Verweis auf ein Objekt anderer Klasse richtig übergeben? Keine Ausgabe!]
Personen, Accounts und Bank sind in jeweils getrennten Klassen
scheinbar nicht, oder was tut der "Person"-Vector in deiner Bankklasse?
class Bank { private: vector<Person> person; vector<Account> account; };
Der
vector<Person> person
dient lediglich als ein Speicherort vonPerson
-Objekten.
Die KlassePerson
ist in seiner eigenen Header definiert und dessen Konstruktor in einercpp
.
-
-
In den anderen Funktionen der
Bank
-Klasse erzeugst du doch auch kein neuesBank
-Objekt und greifst auf die Member zu (Stichwort:this
).
-
@Th69 ja, aber die Funktionen rufe ich in der
menu()
-Funktion auf und übergebe die Werte dann an das Objekt der Klasse
-
Nur warum machst du das?
Du rufst doch in dermain
-Funktion diese Funktion so ähnlich auf:Bank bank; bank.menu();
Und jetzt schreibe darunter mal:
bank.print_account();
und führe es aus (indem du mal mindestens einen Account anlegst und dann das Menü verlässt).
Warum also nicht (wie in den anderen
Bank
-Funktionen auch) einfach// in Zeile 38 deines ersten Code-Beitrags this->print_person(); // bzw. kürzer print_person();
?
-
Im Grunde sind der größte Fluch des C++-Forums irgendwie Professoren und Lehrer
Keiner von denen hat vermutlich jemals ein Software-Projekt durchgezogen...
-
Und verwenden Skripte aus den 90iger Jahren...
-
@It0101 sagte in *Bankkonto*: Verweis auf ein Objekt anderer Klasse richtig übergeben? Keine Ausgabe!:
Im Grunde sind der größte Fluch des C++-Forums irgendwie Professoren und Lehrer
Oder die Existenzberechtigung
-
@Th69 sagte in *Bankkonto*: Verweis auf ein Objekt anderer Klasse richtig übergeben? Keine Ausgabe!:
Nur warum machst du das?
Du rufst doch in dermain
-Funktion diese Funktion so ähnlich auf:Bank bank; bank.menu();
Und jetzt schreibe darunter mal:
bank.print_account();
und führe es aus (indem du mal mindestens einen Account anlegst und dann das Menü verlässt).
Warum also nicht (wie in den anderen
Bank
-Funktionen auch) einfach// in Zeile 38 deines ersten Code-Beitrags this->print_person(); // bzw. kürzer print_person();
?
Meine
main
sieht folgendermaßen aus:int main() { Bank b1; b1.menu(); return 0; }
Ich kann dir jetzt nicht mehr ganz folgen. Dass ich ein Bank-Objekt in der Klasse Bank erzeuge und es besser geht verstehe ich von der Logik her, aber ich komme nicht ganz mit, wie du das besser umschreiben würdest.
Von der Logik her dachte ich, dass ich in der KlasseBank
die Methodemenu()
aufrufe und in dieser Methode ein Objekt der Klasse Bank erzeuge, um sämtliche Eingaben, die der Benutzer macht, im Objekt speichern zu können?@It0101 @manni66 Sonderlich gut erklären können die Profs auch nicht wirklich. Und ich bemühe mich das zu lernen
-
Du hast doch schon das
Bank
-Objektb1
. Für dieses Objekt führst du diemenu
-Funktion aus und möchtest doch auch sicherlich alle Daten in diesem Objekt speichern und nicht in einem anderen.
Du gehst doch auch nicht in die Sparkassen-Filiale und möchtest dort ein Konto der Volksbank erzeugen?!Also so:
switch (eingabe) { case 1: { print_person(); break; } case 2: { print_account(); break; } // ... }
-
void Bank::menu() { bool end = false; Bank bank1; do { Person *p1; int eingabe; cout << "1. Alle Kundendaten anzeigen" << endl; cout << "2. Alle Konten anzeigen" << endl; cout << "3. Neuen Kunden anlegen (ohne Konto)" << endl; cout << "4. Neues Konto anlegen (Kunde muss existieren)" << endl; cout << "5. Neue Buchung" << endl; cout << "6. Kontoauszug fuer Konto ziehen" << endl; cout << "7. Ein Konto aufloesen" << endl; cout << "8. Testdaten einfuegen" << endl; cout << "9. Zum beenden q eingeben" << endl; cout << endl; cin >> eingabe; switch (eingabe) { case 1: { bank1.print_person(); break; } case 2: { bank1.print_account(); break; } case 3: { string vorname; string nachname; int tag; int monat; int jahr; cout << "Vorname: "; cin >> vorname; cout << "\n"; cout << "Nachname: "; cin >> nachname; cout << "\n"; cout << "Tag: "; cin >> tag; cout << "\n"; cout << "Monat: "; cin >> monat; cout << "\n"; cout << "Jahr: "; cin >> jahr; bank1.createUser(vorname, nachname, tag, monat, jahr); cout << endl; break; } case 4: { string nachname; cout << "Geben Sie einen Nachnamen an: "; cin >> nachname; bank1.createAccount(nachname); break; } case 5: { int kontonr; cout << "Geben Sie ihre Kontonr. fuer die Buchung an: "; cin >> kontonr; bank1.createBuchung(kontonr); break; } case 6: { int kontonr; cout << "Kontonr.: "; cin >> kontonr; bank1.kontoauszug(kontonr); } } } while (!end);
Also könnte ich theoretisch auf mein Bank Objekt
bank1
verzichten?
-
Ja, exakt.
-
Ich mach mich mal ran und änder das ab und versuche jetzt weiter voran zu kommen. Danke für die Antworten!