AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TObject kopieren und zuweisen

Ein Thema von helen · begonnen am 16. Jun 2004 · letzter Beitrag vom 13. Jul 2006
 
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: TObject kopieren und zuweisen

  Alt 16. Jun 2004, 12:00
Moin!

Code:
p := s;
Durch diese Zuweisung überschreibst du aber die angelegte Instanz von p und somit hast du in p und in s danach einen Instanzenzeiger auf ein und das selbe Objekt, nämlich s. Würde dieser Code in C++ geschrieben werden (vorausgesetzt die beiden Objekte sind nicht als "Zeiger auf" definiert), dann würde C++ automatisch den CopyConstructor aufrufen und bei p ein neues Objekt anlegen, welches den Inhalt von s übernimmt.

Die beiden Variablen s und p sind intern nur Zeiger auf die Objekte und durch die Zuweisung überschreibst du den einen Zeiger. Mit anderen Worten: Intern hast du zwar immer noch irgendwo im Speicher beide Instanzen rumliegen, weisst aber nur noch von s wo diese liegt (weil p und s darauf zeigen). Du hast dann keine Möglichkeit mehr zu wissen, wo denn die Instanz vom originalen p liegt.

Nochwas: Um das zu verdeutlichen sollte eigentlich deine Freigabe am Ende schief gehen:
Code:
s.Free
p.Free
Da s und p auf die gleiche Instanz zeigen, gibt s.Free die Instanz frei und danach probiert das p auch nochmal, aber da existiert dort keine Instanz mehr, also wird das fehlschlagen mit einer EAccessViolation an einer ziemlich krummen Adresse (die wo vorher die Instanz mal lag).

Nochwas:
Code:
s.zahl := 12;
p.zahl := 12589;
Nachdem du s.zahl die 12 zugewiesen hast, kannst du ja mal vor der Ausführung der nächsten Anweisung (12589 auf p.Zahl zuweisen) mal nachschauen was p.Zahl für einen Wert hat: Ich vermute mal ganz stark 12...

Lösung zu deinem Problem:

Lege dir entweder einen CopyConstructor an oder bastle dir einen Assign Methode...

Bsp Copy Constructor:
Delphi-Quellcode:
Type
  TMember = Class
  Public
    Zahl : Integer;

    Constructor Create; Overload; // normaler Constructor
    Constructor Create(AMember : TMember); Overload; // Copy Constructor
  End;

.....

Constructor TMember.Create(AMember : TMember);
Begin
  inherited Create;

  Zahl := AMember.Zahl; // alles kopieren was an Vars definiert ist
End;
Dann kannst du deine Kopier so anlegen:

  p := TMember.Create(s); // copy constructor aufrufen Nochwas dazu:
Wenn deine TMember Klasse auch private oder Protected Variablen besitzt die auch kopiert werden sollen aber ja nach aussen nicht sichtbar sind (da private/protected), so kannst du diese trotzdem im Constructor kopieren und drauf zugreifen, da alle Klassen in einer Unit untereinander friend Klassen sind. In C++ müsstest du sowas extra noch definieren, Delphi hat das einfach über die Unit gelöst...

MfG
Muetze1
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz