Objekt bei laufzeit erstellen
-
Falls du dann mehrere Kontos haben willst packst du sie in einen Container, zB:
#include <list> using namespace std; ... // Container für alle Kontos list<Account> accounts; ... // Anlegen eines neuen Kontos und hinzufügen zum Container Account acc; acc.setFoo(bar); accounts.push_back(acc); // Alle Kontos durchgehen list<Account>::iterator iter = accounts.begin(); // iteratoren gehen container durch, du beginnst bei accounts.begin() while(iter != accounts.end()) // und gehst solange weiter bis du bei accounts.end() bist { Account& acc = *iter; // das & bedeutet referenz - du willst ja keinen neues acc-objekt sondern das auf das iter zeigt // etwas mit acc machen ++iter; // iterator um eins weitersetzen }MfG SideWinder
-
Dieser Thread wurde von Moderator/in SideWinder aus dem Forum DOS und Win32-Konsole in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
sry aber ich versteh den code nicht ganz. Könntest du den eventuel erläutern?
MFG Dalmendio
-
upps schon gut hat sich erledigt. Vielen dank hast mir sehr geholfen.
Um das ganze zu verstehen muss ich mich jetzt bloß noch mit containern beschäftigen.MFG Dalmendio
-
Okay ich schreib den Code mal auf deutsch:
#include <list> // Container (Behälter für mehrere Objekte) list includieren using namespace std; ... list<Konto> konten; // list für Konto-Objekte namens "konten" ... if(option == 1) // Neues Konto erstellen { // neues konto anlegen Konto neuesKonto; neuesKonto.setBesitzer("Max Mustermann"); // neues konto zum container hinzufügen: konten.push_back(neuesKonto); } ... // alle objkete eines containers kann man mit einem iterator durchgehen: list<Konto>::iterator iter; // beginnen wollen wir am beginn des containers: iter = konten.begin(); // wir gehen in einer schleife solange den container durch bis wir am ende sind: while(iter != konten.end()) { // das konto wo wir derzeit sind holen Konto& konto = *iter; // etwas mit dem konto machen - ausgeben, ändern, keine ahnung was // iter auf das nächste konto im container setzen ++iter; }MfG SideWinder
-
SideWinder takes a note to himself...never answer within 5 minutes to a new question.
MfG SideWinder
-
Hallo
Warum kann man nicht direkt mit dem Iterator arbeiten? Ich habe das eigentlich immer so gemacht und wundere mich deshalb über folgende Zeile:
Konto& konto = *iter;chrische
-
Kann man. Aber was SideWinder geschrieben hat ist fuer Anfaenger verstaendlicher.
-
Hallo
Apollon schrieb:
Kann man. Aber was SideWinder geschrieben hat ist fuer Anfaenger verstaendlicher.
Ich finde es so nicht unbedingt verständlicher, aber das ist wohl Ansichtssache.
chrische
-
Hi,
Für den Anfänger nochmal ein paar Ergänzungen/Korrekturen:
chrische5 schrieb:
...
Warum kann man nicht direkt mit dem Iterator arbeiten?...Iteratoren sind nur solange gültig, solange Du nichts zu einem Container hinzufügst oder entfernst ! Deswegen kannst Du auch kein "Einfügen via iterator machen" (jedenfalls nicht so). Das gilt natürlich auch für daraus abgeleitete Referenzen ("Account& a = *iter;" wird auch ungülltig.)
Solange Du aber weder einfügst noch löschst, kannst Du per iterator auf jedes Objekt nach Belieben zugreifen und es verändern ("non-const-iterator" vorausgesetzt).SideWinder schrieb:
...
if(userAction == NEW_ACCOUNT) { Account acc; // neues konto acc.setBlubb(foo); }...
Hat das Problem, dass nach Verlassen des if-Blocks das Konto nicht mehr existiert. Das ist vermutlich nicht das, was Du willst.
Mit dem Container hat Sidewinder sich aber "gerettet", weil push_back() im Container eine Kopie anlegt. Bei einfachen/kleinen Objekten spielt das keine Rolle aber man sollte das wissen, weil nämlich ein "nachträgliches Verändern" nicht mehr das Objekt im Container betrifft:if(userAction == NEW_ACCOUNT) { Account acc; // neues konto accounts.push_back(acc); acc.setBlubb(foo); } accounts.back().getBlubb(); // ist != fooNicht dramatisch, muss man aber bedenken.
Gruß,
Simon2.