AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Doppeltes Create?

Ein Thema von internetnavigator · begonnen am 7. Jun 2010 · letzter Beitrag vom 7. Jun 2010
Antwort Antwort
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

AW: Doppeltes Create?

  Alt 7. Jun 2010, 17:35
Nein, ist es nicht. Denn beim zweiten wird kein Objekt erzeugt! Oder siehst du da eine Zuweisung zu einer Objektvariablen?

MyObject := TMyClass.Create;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
internetnavigator

Registriert seit: 13. Mai 2006
94 Beiträge
 
RAD-Studio 2010 Arc
 
#2

AW: Doppeltes Create?

  Alt 7. Jun 2010, 17:39
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.361 Beiträge
 
Delphi 12 Athens
 
#3

AW: Doppeltes Create?

  Alt 7. Jun 2010, 17:41
Delphi-Quellcode:
LT:=TBintree.Create;
...
LT.create(TString.create(BlattL));
Wenn das/ein instanziertes Objekt in LT existiert, dann kann man einen Konstuctor auch über eine Objektinstanz erstellen und nicht nur über die Klasse.

Allerdings wird hier ein weiteres Objekt erstellt, welches im Nirvana verschwindet ... Ergo sollte ein Speicherleck entstehen.


Nee, wird doch als Methode aufgerufen
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;
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 7. Jun 2010 um 17:48 Uhr)
  Mit Zitat antworten Zitat
internetnavigator

Registriert seit: 13. Mai 2006
94 Beiträge
 
RAD-Studio 2010 Arc
 
#4

AW: Doppeltes Create?

  Alt 7. Jun 2010, 17:52
Ja aber ein Objekt wird doch dennoch erstellt nur nie zugewiesen oder?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.874 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Doppeltes Create?

  Alt 7. Jun 2010, 18:35
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
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.361 Beiträge
 
Delphi 12 Athens
 
#6

AW: Doppeltes Create?

  Alt 7. Jun 2010, 19:04
Hatte ich eigentlich auch so gedacht, aber ein Test hat mich eines Besseren belehrt.


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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
internetnavigator

Registriert seit: 13. Mai 2006
94 Beiträge
 
RAD-Studio 2010 Arc
 
#7

AW: Doppeltes Create?

  Alt 7. Jun 2010, 19:27
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?
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.123 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Doppeltes Create?

  Alt 7. Jun 2010, 20:07
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?
Jain.
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
internetnavigator

Registriert seit: 13. Mai 2006
94 Beiträge
 
RAD-Studio 2010 Arc
 
#9

AW: Doppeltes Create?

  Alt 7. Jun 2010, 20:13
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;
{...}

Geändert von mkinzler ( 7. Jun 2010 um 20:18 Uhr) Grund: Delphi Formatierung aktiviert: Für delphi Quellcode bitte [Code=Delphi] verwenden
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 07:51 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