![]() |
Delphi-Version: 2010
Doppeltes Create?
Hallo :)
Ich habe eine kleine und kurze, schnell zu beantwortende Frage: Ich sehe zurzeit Quellcode aus der Schule durch weil ich bald 'ne Klausur in Informatik schreibe. Dabei bin ich auf Folgendes gestoßen:
Delphi-Quellcode:
var
LT, RT:TBintree; {...} LT:=TBintree.Create; RT:=TBintree.Create; {...} LT.create(TString.create(BlattL)); RT.create(TString.create(BlattR)); {...}
Delphi-Quellcode:
Ist das Create da nicht doppelt und könnte man das Erste nicht direkt in
// In der TBinTree Klasse
{...} constructor create;overload; virtual; constructor create(pObject:TObject);overload; virtual; {...}
Delphi-Quellcode:
ändern?
LT := TBintree.Create(TString.create(BlattL));
RT := TBintree.Create(TString.create(BlattR)); Weil eigentlich müsste dann doch LT bzw. RT von dem 2. Create erneut erstellt werden und das Erste eh "überschrieben" sein, oder? Gruß !N |
AW: Doppeltes Create?
Da wird der Konstruktor wie eine Methode benutzt. Ungewöhnlich, sollte aber funktionieren. Und ja, man sollte eigentlich gleich den zweiten Konstruktor aufrufen können.
|
AW: Doppeltes Create?
Funktionieren tut es auch. Nur es sieht so "unsauber" aus und ich habe die Befürchtung, dass, wenn ich es so in der Klausur schreibe, es Rot gibt. (Nebenbei der Code ist nicht von mir :-)). Von einer Lehrkraft, deshalb wundert es mich umso mehr.
|
AW: Doppeltes Create?
So wie ich das sehe ist das erste Create überflüssig. Es handelt sich ja auch um eine overload Prozedur...
Edit Oh, das hatte ich übersehen Liebe Grüße |
AW: Doppeltes Create?
Nein, ist es nicht. Denn beim zweiten wird kein Objekt erzeugt! Oder siehst du da eine Zuweisung zu einer Objektvariablen?
Delphi-Quellcode:
MyObject := TMyClass.Create;
|
AW: Doppeltes Create?
Zugewiesen wird nichts, da hast du Recht, aber die nötige Änderung habe ich ja vorgeschlagen. Es schien mir nur doppelt, erst ein Objekt zu erzeugen und dann noch einmal das Create als Methode aufzurufen.
Gruß !N |
AW: Doppeltes Create?
Delphi-Quellcode:
Wenn das/ein instanziertes Objekt in LT existiert, dann kann man einen Konstuctor auch über eine Objektinstanz erstellen und nicht nur über die Klasse.
LT:=TBintree.Create;
... LT.create(TString.create(BlattL)); Allerdings wird hier ein weiteres Objekt erstellt, welches im Nirvana verschwindet ... Ergo sollte ein Speicherleck entstehen. Nee, wird doch als Methode aufgerufen :shock:
Delphi-Quellcode:
type
TMyClass = class constructor Create; end; constructor TMyClass.Create; begin ShowMessage(IntToStr(Integer(Self))); end; var C: TMyClass; begin C := TMyClass.Create; C.Create; C := nil; C.Create; end; |
AW: Doppeltes Create?
Ja aber ein Objekt wird doch dennoch erstellt nur nie zugewiesen oder?
|
AW: Doppeltes Create?
Nein, ein Konstruktor hat eine doppelte Identität:
1. Klassenmethode; Aufruf über Klasse: erzeugt neue Instanz und gibt diese zurück 2. Normale Methode; Aufruf über Objekt(Instanz): setzt Werte im existenten Objekt |
AW: Doppeltes Create?
Hatte ich eigentlich auch so gedacht, aber ein Test hat mich eines Besseren belehrt. :oops:
Laut dem Inneren Code sieht es so aus, als wenn vor einm Konstructor (im ersten BEGIN geprüft wird, ob die Instantz existiert und wenn nicht, dann wird eine Instanz erstellt. Beim Aufruf über den Klassentypen wird da wohl NIL übergeben. So oder so wird am Ende die Instanz als Result zurückgeliefert, ob man dieses nun abfängt oder nicht. |
AW: Doppeltes Create?
Und wie schaut es nun aus wenn man es kürzer haben will? Man brauch den 2. Aufruf doch nicht wenn man den Ersten wie von mir oben angegeben modifiziert, oder?
|
AW: Doppeltes Create?
Zitat:
Dadurch, dass man den Konstruktor verwendet, kann man gezielt das eigentliche Tree-Objekt erzeugen, und kann somit, strukturiert, die Resourcen belegen, und wieder freigeben. Beispielsweise lassen sich die beiden Bäume so einmalig im OnCreate eines Formulares erzeugen und im OnDestroy wieder freigeben, ohne die sonstigen Möglichkeiten der Klasse zu benutzen. So kann man dann die Bäume mehrfach verwenden. Wie sehen eigentlich die Konstruktoren intern aus. |
AW: Doppeltes Create?
So:
Delphi-Quellcode:
(* Quelle
Rekursive Fassung (geeignet auch zum Ableiten von Suchbäumen etc.) aus: http://www.info-seminar.de/KlassenZA/ Stand: 30.01.2007 Rückfragen und Verbesserungsvorschläge bitte an Joachim Deckers <za-klassen@deckers.name> Bearbeitet entsprechend den "Materialien zu den zentralen Abiturprüfungen im Fach Informatik 2008. Objektorientierter Ansatz Delphi", http://www.standardsicherung.schulministerium.nrw.de/abitur-gost/fach.php?fach=15 Änderungen (16.10.07): (1) addTreeLeft (addTreeRight) wurden ersetzt durch setLeftTree (setRightTree) (2) Die Parameternamen pItem wurden ersetzt durch pObject *) {...} constructor TBintree.create; // leeren Baum erzeugen begin kenntInhalt:=nil; kenntLinkenNachfolger:=nil; kenntRechtenNachfolger:=nil; end; constructor TBintree.create(pObject:TObject); // Baum mit zwei leeren Teilbäumen erzeugen begin kenntInhalt:=pObject; if pObject<>nil then begin kenntLinkenNachfolger:=Klassentyp(self.ClassType).create; kenntRechtenNachfolger:=Klassentyp(self.ClassType).create; end else begin kenntLinkenNachfolger:=nil; kenntRechtenNachfolger:=nil; end end; {...} |
AW: Doppeltes Create?
Deine verkürzte Fassung
Delphi-Quellcode:
müsste auch funktionieren, falls nicht wesentliche Teile aus dem Sourcecode fehlen.
LT := TBintree.Create(TString.create(BlattL));
RT := TBintree.Create(TString.create(BlattR)); Das einzige, was ich in den Konstruktoren vermisse ist ein Aufruf von
Delphi-Quellcode:
zu Beginn.
inherited Create;
Wenn die Klasse von TObject abgeleitet ist, braucht man dass zwar nicht zwingend, da der Konstruktor von TObject leer ist, aber wenn sich das mal ändern sollte, kann man sich Probleme einhandeln. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 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 by Thomas Breitkreuz