Objekte dynamisch anlegen und initialisieren



  • Hallo,

    wie kann ich mehrere Objekte anlegen und mit überladenem Konstruktor unterschiedlich initialisieren ?

    Objekt *pObjektListe = new Objekt[100];
    
    // bestehendes Objekt eintragen
    // erzeugt mit default Ctor
    pObjektListe[0] = *myObjekt1;
    pObjektListe[1] = *myObjekt2;
    
    // das funktioniert nicht
    // neues Objekt mit überladenem Ctor
    pObjektListe[2] = new Objekt( 10, "Text", 500 );
    

    Wie kann ich das Objekt in ...Liste[2] neu anlegen bzw. anders initialisieren ?

    Danke und Gruß

    WoWe



  • Benutze besser einen STL-Container; etwa so

    std::vector< Objekt> objekte;
    objekte.push_back( Objekt( 10, "Text", 500 ) );
    objekte.push_back( Objekt( 12, "noch ein Text", 499 ) );
    // usw.
    

    Gruß
    Werner



  • Hallo Werner,

    vielen Dank für deinen Tip. Hab ich jetzt mit "vector" gemacht und funktioniert auch. Kannst du mir bitte noch sagen (nur für mein Verständnis) was an meinem Beispiel falsch war und warum du std::vector benutzt.

    WoWe



  • Das Problem bei deinem Code ist, dass du versuchst in der pObjektliste[2] einen Zeiger zu speichern, während du in pobjekt[0] und pObjekt[1] richtige Objekte speicherst.

    Dein Quellcode würde ohne Fehler ausgeführt wenn du folgendes Schreibst:

    pObjekt[2] = *(new Objekt[10, "Text", 500));
    

    Ist zwar dann syntaktisch richtig jedoch ein logischer Fehler, weil du dann ein MemoryLeak erzeugst oO.

    EDIT:
    Alternativ könntest du auch eine Liste mit Zeigern erstellen:

    Objekt *pObjektListe[100]; // = new Objekt[100]; 
    
    // bestehendes Objekt eintragen 
    // erzeugt mit default Ctor 
    pObjektListe[0] = myObjekt1; 
    pObjektListe[1] = myObjekt2; 
    
    // das funktioniert nicht 
    // neues Objekt mit überladenem Ctor 
    pObjektListe[2] = new Objekt( 10, "Text", 500 );
    

    Doch hättest du dann ein Problem mit dem freigeben.
    Du weißt schließlich nicht welche Zeiger auf den Heap zeigen und welche nicht.



  • WoWe schrieb:

    Kannst du mir bitte noch sagen (nur für mein Verständnis) was an meinem Beispiel falsch war und warum du std::vector benutzt.

    Hallo WoWe,

    nicht wirklich falsch, aber sehr umständlich, weil Du sowohl den Speicher der dynamisch erzeugten Objekte als auch den Speicher für die Pointer wieder freigeben must. Es ist nicht dynamisch, da Du auf 100 Einträge begrenzt bist und vor allem ist es fehlerträchtig. Ich unterstelle mal, dass 'myObjekt1/2' auf dem Stack liegen oder Member einer Klasse sind und 'pObjektListe[2]' liegt auf dem Heap. Später beim Freigeben des Speichers musst Du das berücksichtigen. Dabei können naturgemäß Fehler gemacht werden.
    std::vector<> nimmt Dir diese Arbeit ab.

    Gruß
    Werner



  • Was das "nicht dynamisch" angeht.

    vektor macht das intern nicht viel anders, sollte es dann mehr Einträge geben als vorhanden sind, wird eine neue Liste erstellt mir mehr platz, die alten daten werden "umgezeigt" und die neuen hinzugefügt.

    Aber wäre halt, wie du es schon erwähnt hattest, ziemlich umständlich und fehleranfällig dies selbst zu erledigen, aber immerhin möglich.



  • Vielen Dank für eure Antworten, hat mir sehr geholfen ! Dann werde ich mich doch mal mit der STL beschäftigen.

    Gruß WoWe


Anmelden zum Antworten