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 != foo
    

    Nicht dramatisch, muss man aber bedenken.

    Gruß,

    Simon2.


Anmelden zum Antworten