Objekte mit Array erzuegen



  • Hallo zusammen,

    ich soll in einer Aufgabe 10 Objekte der Klasse Kiste mit einem Array erzeugen. Es sollte die MÖglichkeit bestehen, bis zu 100 Kisten zur Laufzeit anzulegen.
    Initialisierung der Variablen soll über den Konstruktor erfolgen.

    Meine Frage:

    Wie bekomme ich das hin?

    Wenn ich z.B. Kiste meineKisten[100] schreibe, dann kommt a) eine Fehlermeldung, da ich den Standardkonstruktor überschrieben habe und b) werden dann ja hier gleich 100 Objekte erzeugt?

    Ich kenne mich da nur von Java aus, da ging das so:

    Kiste meineKisten[100];
    
    meineKisten[0] = new Kiste("Nummero 1", 500, 60);
    meineKisten[1] = new Kiste("Nummero 2", 600, 70);
    ...
    

    Zumindest dachte ich dass bei Java das Objekt erst tatsächlich erzeugt wird, wenn der Operator "new" verwendet wird?

    Aber new oder so in Verbindung mit C++ hatten wir bis jetzt noch nicht.

    Habt ihr eine Ahnung wie das bei C++ funktionieren soll?

    Danke!

    Viele Grüße!



  • Schau dir mal die STL-Container (wie z.B. std::vector ) an. Hier findest du einen einführenden Artikel, auf www.cplusplus.com hast du eine vollständige Dokumentation.



  • Hallo!

    Danke, ich habs mir durchgeschaut. Das ist alles zu kompliziert. Wir haben bei weitem das noch nicht in der Schule durchgenommen.

    In der Aufgabe steht geschrieben:

    ***Die Verwaltung der Kisten (maximal 100) soll über Felder erfolgen

    Erzeugen Sie zunächst 10 Kisten über einen Konstruktor mit Paramterliste.***
    Wie würdet ihr das verstehen?

    Ich hätte zuerst ein Array erstellt und die ersten 10 Felder gefüllt??

    Viele Grüße



  • Du kannst auch in C++ dynamische Arrays mit new[] und delete[] verwenden. Nur ist das noch viel komplizierter als mit std::vector . Um z.B. ein Array zu vergrössern, musst du ein neues Array anfordern, alles kopieren, den alten Speicher freigeben und die Zeiger umhängen. Und nicht zu vergessen die Grösse irgendwo separat abzuspeichern und zu aktualisieren. Während bei std::vector dafür ein Funktionsaufruf reicht, der alles automatisch tut.

    Anders siehts natürlich aus, wenn du ein statisches Array mit fixer Grösse nimmst und davon ein paar Elemente leer lässt. Nur müssen dann halt alle Elemente standardkonstruierbar sein. Oder du verwendest wieder Zeiger und new .



  • Ja, genau das möchte ich auch:

    Ein Array mit 100 reservierten Plätzen.

    Davon sind nur 10 belegt.

    Das Problem ist nur, ich soll keinen Standardkonstruktor verwenden sondern einen eigen erstellten.

    Mit

    Kiste meineKisten[100];
    
    meineKisten[0] = new Kiste ("Nummero 1",500,70);
    

    klappt das leider nicht 😞

    Wie gehtn das?



  • Wie gesagt: Indem du Zeiger als Array-Elemente nimmst. Wenn du nicht weisst, worum es sich bei Zeigern handelt, solltest du dich entsprechend einlesen, sonst macht das Ganze wenig Sinn. Als Einstieg empfehle ich das hier.



  • Hallo!

    Also ich bin mir sicher das dass mit den Zeigern nicht gefordert ist. Viel zu kompliziert für den jetzigen Stand.

    Ich denke vielmehr, dass Defaultwerte hinterlegt werden müssen,

    also in der Art

    Kiste meineKisten [100] (" ",999,999);
    

    Aber so funktioniert das nicht, da bei Arrays anscheinend so nur der Standardkonstruktor aufrufbar ist.

    Kann man das irgendwie umändern, sodass man von einem Array aus einen Konstruktor mit Paramterliste aufrufen kann? Es sollen für alle Elemente des Arrays die gleichen Werte gesetzt werden.

    Viele Dank!



  • Dann biete doch einfach einen Standardkonstruktor an.



  • Sören20 schrieb:

    ...

    In der Aufgabe steht geschrieben:

    ***Die Verwaltung der Kisten (maximal 100) soll über Felder erfolgen

    Erzeugen Sie zunächst 10 Kisten über einen Konstruktor mit Paramterliste.***
    Wie würdet ihr das verstehen?

    Ich hätte zuerst ein Array erstellt und die ersten 10 Felder gefüllt??

    Viele Grüße

    Aus der Aufgabenstellung vermute ich Folgendes:

    1. Die Klasse Kiste besitzt keinen Standardkonstruktor, sondern erwartet eine Anzahl von Parametern. Damit können Kisten in Feldern nur dynamisch erzeugt werden.

    2. Es gibt maximal 100 Kisten.

    Daraus schließe ich, dass die Kisten dynamisch erzeugt und in einem Array abgelegt werden sollen:

    // Anzahl der benutzten Kisten
    unsigned int KistenAnzahl;
    
    // Feld zur Verwaltung der Kisten
    Kiste* Kisten[100];
    
    void erzeuge_kiste( TypA ParamA, TypB ParamB, TypC ParamC )
    {
       if( KistenAnzahl < 100 )
       {
          // neue Kiste erzeugen und im Feld ablegen
          Kisten[KistenAnzahl] = new Kiste( ParamA, ParamB, ParamC );
    
         // Anzahl der Kisten erhöhen
         KistenAnzahl = KistenAnzahl +1;  
       }
       else
       {
          // Behandlung für den Fall, dass bereits 100 Kisten existieren
       }
    }
    
    void loesche_kisten()
    {
       // alle erzeugten Kisten löschen
       for( unsigned int i = 0; i < KistenAnzahl; ++i )
       {
          delete Kisten[i];
       }
    }
    
    int main()
    {
       // globale Zählvariable auf Startwert setzen
       KistenAnzahl = 0;
    
       // 10 Kisten erzeugen
       for( unsigned int i = 0; i < 10; ++i )
       {
          erzeuge_kiste( A,B,C );
       }
    
       // Kisten löschen
       loesche_kisten();
    }
    


  • Hallo,

    danke für die Antworten!

    Ich habe das jetzt so gelöst, dass beim Erzeugen des Arrays Defaultwerte gesetzt werden

    Kisten kiste[100] dann werden im Konstruktor einfach Standardwerte gesetzt (z.B. id_Nummer 999)

    Noch eine andere Frage:

    Wenn ich Objekte mit "new" erzeuge, das Programm ausführe und es ganz normal beende, bleibt dann der Speicherbereich weiterhin reserviert? Mir wurde gesagt, Objekte die mit new erzeugt werden MÜSSEN zerstört werden (Destruktor) Stimmt das??

    Vielen Dank!

    Viele Grüße!


  • Mod

    Sören20 schrieb:

    Wenn ich Objekte mit "new" erzeuge, das Programm ausführe und es ganz normal beende, bleibt dann der Speicherbereich weiterhin reserviert?

    In dem was du machst: Nein
    Aber es ist durchaus möglich, weshalb man darauf achten sollte, dass man alles wieder freigibt. Außerdem fördert es guten Stil. Wie du nämlich bald feststellen wirst, ist es ziemlich nervig, für jeden möglichen Programmverlauf die richtigen deletes passend zu programmieren. Und dann guckt man sich RAII an und stellt fest, dass man das gar nicht muss. Und dann hat man viel über C++ gelernt und kann in Zukunft viel besser mit der Sprache umgehen und die gelernten Dinge auch auf andere Problemstellungen anwenden.

    Mir wurde gesagt, Objekte die mit new erzeugt werden MÜSSEN zerstört werden (Destruktor) Stimmt das??

    Siehe oben.



  • Beim Programmende werden Objekte die mit new erzeugt wurden wieder freigegeben. Mache dir das aber nicht zur Gewohnheit, sondern mache es richtig und benutze immer ein delete wenn ein new verwendet wurde.



  • Danke!

    Also bedeutet es hier, dass sobald das Programm beendet wird, der Speicher komplett wieder freigegeben wird? 🙂

    Ist das bei Java auch so?

    viele Grüße


  • Mod

    Sören20 schrieb:

    Also bedeutet es hier, dass sobald das Programm beendet wird, der Speicher komplett wieder freigegeben wird? 🙂

    Für deine Zwecke: Ja.

    Ist das bei Java auch so?

    Da sowieso.


Anmelden zum Antworten