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 user profile iconKlabautermann: 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 user profile iconKlabautermann: 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);