Verständnisproblem mit Array
-
hallo,
ich frage mich folgendes:wenn ich ein array erstelle mit z.B. (class testclasse) testklasse *test = new Testklasse[100];
es handelt sich dabei ja um ein array von pointern auf eine speicherstelle vom typ testklasse.
wenn ich nun dieses array vergrössern will, dann erstelle ich ein neues array mit z.b. testklasse *test2 = new Testklasse[120] und kopiere in einer schleife ala test2[0] = test[0];
da es sich hier aber eigentlich nur um pointer handelt, müsste es doch probleme geben, wenn ich delete [] test; verwende. lösche ich damit nicht auch die test2 inhalte ?
-
Hi,
da du ja dir neuen Speicher für test2 besorgst und dann mit test2[0] = test[0] alle Werte in diesen neuen Speicher kopierst, passiert beim delete test nichts

Edit::SyntaxKorrekt();
-
Dein Verständnidproblem fängt ganz vorn an.

testklasse *test = new testklasse[100];test zeigt auf das erste Element eines arrays von 100 Elementen
vom Type testklasse. Nochmal, dieses array enthält keine Pointer
sondern Elemente das gewünschten Typs. Das Ergbnis von new liefert
allerdings einen Zeiger, und zwar auf das erste Element des arrays.Damit dürfte sich der Rest deiner Fragen hoffentlich erledigt haben.
-
hmm,
dann dürfte man aber nicht mit = arbeiten dürfen.
wenn ich hier mit = kopieren würde, würde ja eine kopie des objektes angefertgt werden.
in einem anderen threads habe ich aber gelesen, dass man nicht so ohne weiteres eine kopie eines objektes anlegen kann.
wie kriege ich denn nun die daten des ersten arrays schnell ins zweite array, wenn = nicht geht ?
-
Hier, ich habe den beitrag mal rausgesucht:
sagt mal, wenn ich ein umfangreiches objekt (mit new erzeugt) habe, welches über einen ganzen haufen dynamischer arrays, zeigern und co hat.
wie stelle ichs am besten an, dass ich eine exakte kopie (auch mit new erzeugt) davon erhalte - sprich ein unabhängiges neues objekt ?
muss ich von hand alles rüberkopieren oder geht es auch einfacher ?
000000000000000000000000000000000000000000000
Phoemuex
MitgliedBenutzerprofil
Anmeldungsdatum: 06.10.2004
Beiträge: 210Beitrag Phoemuex Mitglied 17:23:56 22.12.2006 Titel: Re: Kopie vom Objekt wie am besten ? Zitieren
bblb schrieb:
muss ich von hand alles rüberkopierenJa, schreib dir am Besten dazu einen eigenen Copy-Konstruktor/Zuweisungsoperator.
Felix Rudolf...
-
Hallo,
KartoffelBube schrieb:
wenn ich hier mit = kopieren würde, würde ja eine kopie des objektes angefertgt werden.
Und genau das ist _kein_ Problem, sofern der Zuweisungsoperator der Klasse korrekt arbeitet. Merke: Eine (korrekte) Kopie eines Objektes b von einem anderen Objekt a führt dazu, dass b völlig unabhängig von a ist. => Wenn a zerstört wird, ist b davon gänzlich unberührt. Andersherum gilt dies natürlich auch.
Wie bereits RedHead erwähnt hat: Du arbeitest in der Schleife mit den Objekten der Klasse und nicht mit Zeigern darauf. D.h. es wird wenn duT foo, bar; ... foo = bar;schreibst, der Zuweisungsoperator der Klasse T aufgerufen und nicht die Adresse von bar in foo gespeichert.
Dies ist bei folgendem Code der Fall:T foo, bar; T *p_foo = &foo, *p_bar = &bar; p_foo = p_bar; // p_foo zeigt nun auf bar und nicht mehr auf foo.Hier wird _nicht_ der Zuweisungsoperator von T aufgerufen.
in einem anderen threads habe ich aber gelesen, dass man nicht so ohne weiteres eine kopie eines objektes anlegen kann.
Das ist genau dann richtig, wenn dieses Objekt selbst mit dynamischem Speicher hantiert. Dann musst du dich selbst um eine Korrekte Kopier- und Zuweisungs-Semantik kümmern.
wie kriege ich denn nun die daten des ersten arrays schnell ins zweite array, wenn = nicht geht ?
Verwendet deine Klasse dynamischen Speicher? Wenn ja: kümmere dich um korrektes Kopieren und Zuweisen (schreibe eigenen copy-ctor und op=).
Ansonsten musst du dir keine Gedanken um den von dir beanstandeten Code machen
Gruß, Caipi
-
ja, die klasse verfügt über eine verkettete liste.
in dem fall, reicht es doch, wenn ich den zeiger im neuen objet übernehme und den im alten objekt vorm löschen auf null setze. oder muss aich auch hier die komplette liste neu erstellen ? ich denke nicht - oder ?
-
Bei der Zuweisung von 2 Klassenobjekten, wenn die klasse selbst keinen Copy-Konstruktor hat, macht der compiler einen memcpy daraus.
Das funktioniert solange gut, solange die klasse keine dynamischen Elemente enthält.
Sobald dynamische Elemente enthalten sind, muss ein Copy-Konstruktor implementiert werden. Ansonsten gibt es ein crash, wenn man beide objekte löschen möchte.
-
OK - habs verstanden und auch eingebaut.
aber eine frage. der Zuweisungsoperator.
wie wird der bei virtuellen klassen eingebaut. ganz normal mit virtual ? oder muss ich da etwas beachten ?