Objekt bei laufzeit erstellen



  • Hi Leute,
    ich habe eine Klasse erstellt für Kontodaten. Wenn man das programm startet
    dann soll es eine Option für "Neues Konto erstellen" geben.
    Aber dann würde das neue Objekt ja erst während der Laufzeit erstellt werden. Meine Frage ist nun wie mache ich das und ist das überhaupt möglich. Ich möchte dies deswegen machen weil ich ja nicht schon vorher Konto1, Konto2, Konto3..... erstellen möchte.

    MFG Dalmendio



  • weiß da niemand weiter 😞



  • Klar ist das möglich:

    if(userAction == NEW_ACCOUNT)
    {
        Account acc; // neues konto 
        acc.setBlubb(foo);
    }
    

    MfG SideWinder



  • 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