Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Copy-Constructor
Yvonne - Do 23.01.03 13:53
Titel: Copy-Constructor
Hallo,
ich benötige eine Funktion, mit der ich ein neues Object B erzeuge und die Daten von Object A gleich hineinkopieren kann, um dann dieses Objekt in einer Objectliste zu speichern.
Bisher habe ich folgendes gemacht:
Quelltext
1: 2: 3: 4: 5: 6:
| function MyClass.copy: MyClass; begin result:= MyClass.create; result.AttribA:= self.AttribA; ... end; |
Aufgerufen habe ich das dann immer mit
Quelltext
1: 2: 3: 4: 5: 6:
| var Object1: MyClass; MyList: TObjectList; begin MyList:= TObjectList.create; Object1:= MyClass.create; MyList.Add(Object1.copy); ... Object1.free; MyList.free; end; |
Dies hat bisher immer ganz gut geklappt. Aber in einem Fall verliert self nach dem Aufruf von create seine Attributwerte.
Kann mir das jemand erklären? Und gibt es einen besseren Weg dies zu bewerkstelligen?
Danke schon mal,
Yvonne
Moderiert von
Klabautermann: Code-Tags hizugefügt & BBC Aktiviert.
Udontknow - Do 23.01.03 14:05
Hi!
Bitte poste doch einmal genau den Code, der Schwierigkeiten macht.
Cu,
Udontknow
Yvonne - Do 23.01.03 14:14
in meinem vorherigen beispiel habe ich folgende zeile gehabt:
Quelltext
1:
| MyList.Add(Object1.copy) |
Angenommen Object1 hat AttribA = 5.
Wenn ich dann in die Copy-Funktion gehe, ist bevor ich die Zeile
Quelltext
1:
| result:= MyClass.create |
ausführe, auch noch der Wert richtig vorhanden.
Allerdings nach Ausführung der zeile
Quelltext
1:
| result:= myClass.create |
ist self.AttribA = 0.
Ich hoffe es ist jetzt etwas klarer geworden. Ich kann leider den original-SourceCode nicht hinzufügen, da das über x-Units läuft.
Mein Problem ist vor allem, daß der Code eine ganze zeit lang richtig läuft,
und dann erst - für mich nicht nachvollziehbar wann - den Fehler bringt.
Danke schon mal,
Yvonne
Moderiert von
Klabautermann: Code-Tags hizugefügt & BBC Aktiviert.
Keldorn - Do 23.01.03 14:19
Hallo
ich versteh das nicht ganz:
Quelltext
1: 2: 3:
| Object1:= MyClass.create; MyList.Add(Object1.copy); ... Object1.free; |
warum nicht so,wenn du die Objektlist mit xxx.create(true) erstellst:
Quelltext
1: 2: 3: 4: 5: 6:
| Object1:= MyClass.create; object1.blabla:='blabla1' MyList.Add(Object1); Object1:= MyClass.create; object1.blabla:='blabla2' MyList.Add(Object1); |
die Objekte werden automatisch wieder freigegeben
Mfg Frank
Yvonne - Do 23.01.03 14:23
muß ich dann denn nicht innerhalb der Funktion irgendwann Object1
wieder freigeben?
Keldorn - Do 23.01.03 14:33
Yvonne hat folgendes geschrieben: |
muß ich dann denn nicht innerhalb der Funktion irgendwann Object1
wieder freigeben? |
Jein, kommt drauf an, wie du deine Objektliste created hast.
der booleanwert steht für
ownobjekts.
wenn du true übergibst, macht das löschen die liste automatisch bei clear.
Wichtig ist dann aber, daß du auch immer ein neues Object erzeugst, daß du der liste hinzufügst.
würdest du dann das Object freigeben, ist auch dein Listeintrag pfutsch.
wenn du false übergibst, darfst du das löschen am Ende alles selber machen. Das steht aber genauer in der Onlinehilfe.
google mal nach Memproof, da kannst das gut nachvollziehen, ob der speicher freigegeben wird oder nicht.
hab jetzt hier nur D3 und muß n bissel raten :?
Frank
smiegel - Do 23.01.03 14:33
Hallo,
solange sich Deine Objekte von TObjekt ableiten und sie brav mit AddObjekt Deiner Liste zufügst, übernimmt das die Liste für Dich.
Yvonne - Do 23.01.03 14:43
Danke für die ersten Hinweise, ein bischen weiter komme ich jetzt schon. Wie gehe ich aber vor, wenn ich der Liste mehrere Objekte mit den selben Attributwerten hinzufügen möchte. Daraus ist nämlich diese ganze Geschichte entstanden:
Quelltext
1: 2: 3: 4: 5: 6: 7:
| var MyObject: MyClass; ...
for i:= 0 to irgendwas do begin MyList.Add(MyObject.Copy); end; |
Wenn ich das sonst ohne Copy mache, bekomme ich mächtigen Ärger, wenn ich die Liste lösche.
Danke nochmals,
Yvonne
smiegel - Do 23.01.03 14:56
Hallo,
Quelltext
1:
| MyList.Add(MyObject.Create); |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!