Objekte mit Array erzuegen
-
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[]unddelete[]verwenden. Nur ist das noch viel komplizierter als mitstd::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 beistd::vectordafü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:
-
Die Klasse Kiste besitzt keinen Standardkonstruktor, sondern erwartet eine Anzahl von Parametern. Damit können Kisten in Feldern nur dynamisch erzeugt werden.
-
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!
-
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
-
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.