[gelöst] Constructoren einer Klasse überladen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
mintpc
Beiträge: 124
Registriert: Mo 6. Sep 2010, 18:39
OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
CPU-Target: Win 7
Wohnort: Mailand

[gelöst] Constructoren einer Klasse überladen

Beitrag von mintpc »

Hallo zusammen,

ich hätte da mal ne Frage zum Überladen von Konstruktoren und dabei den Aufruf eines
Constructors aus einem anderen heraus.

Das Beispiel hier funktioniert, aber mir geht es um die mit //*** markierte Zeile des Codes.

Code: Alles auswählen

constructor TAuto.create (inKm: integer);
begin
  self.km := inKm;
end;
 
constructor TAuto.create (inKm, inPreis: integer);
begin
   self.create (inKm);  // ***
   self.Preis := inPreis;
end;
Da ruft der untere Constructor den oberen auf. Der obere ruft ja aber seinerseits wieder
den Standardconstructor createauf. Soweit, so gut.

Nun ruft der untere Constructor ja aber eigentlich auch den Standardconstructor create auf.
Wird dieser also 2x aufgerufen und werden da eigentlich 2 Objekte erstellt, oder ist der Programm-
code so ok.

Besten Dank schonmal
mintpc
Zuletzt geändert von mintpc am Mi 11. Nov 2015, 23:42, insgesamt 2-mal geändert.

TBug
Beiträge: 179
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: Constructoren einer Klasse überladen

Beitrag von TBug »

mintpc hat geschrieben: Da ruft der untere Constructor den oberen auf. Der obere ruft ja aber seinerseits wieder
den Standardconstructor createauf. Soweit, so gut.

Nun ruft der untere Constructor ja aber eigentlich auch den Standardconstructor create auf.
Wird dieser also 2x aufgerufen und werden da eigentlich 2 Objekte erstellt, oder ist der Programm-
code so ok.
In Deinem Beispiel wird gar kein Standard-Constructor aufgerufen, sondern nur den bzw. die Du selbst in Deiner Klasse TAuto definiert hast.

Um den Constructor der Basis-Klasse aufzurufen musst Du im Constructor inherited benutzen.

Code: Alles auswählen

 
TAuto.create (inKm: integer);
begin
  inherited Create();
  self.km := inKm;
end;
 
.

mintpc
Beiträge: 124
Registriert: Mo 6. Sep 2010, 18:39
OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
CPU-Target: Win 7
Wohnort: Mailand

Re: Constructoren einer Klasse überladen

Beitrag von mintpc »

Danke erstmal für die Antwort, die mir aber nicht genügt. Dass inherited create den Konstruktor der
Vaterklasse aufruft, ist klar. Aber wir haben hier ja gar keine Vaterklasse. Wir haben hier zwei
überladene Konstruktoren.

Ich versuche meine Frage nochmal mit folgendem Beispiel zu präzisieren:

Code: Alles auswählen

Auto1 := TAuto.create(180000, 4000);
erzeugt ein Objekt vom Typ TAuto und legt die Referenz Auto1 auf dieses Objekt. Gut.

Nun wird aber im Konstuktor nochmal

Code: Alles auswählen

self.create(180000); 
aufgerufen. Wird hier nochmal ein zweites Object erzeugt, auf das keine Referenz mehr zeigt?

Nein, oder? Das ist meine Frage.

mintpc

wp_xyz
Beiträge: 5175
Registriert: Fr 8. Apr 2011, 09:01

Re: Constructoren einer Klasse überladen

Beitrag von wp_xyz »

Aktiviere HeapTrc (Projekteinstellungen / Debuggen / Unit Heaptrc verwenden). Falls ein zweites, nicht mehr erreichbares Objekt erzeugt wird, müsste HeapTrc beim Programm-Ende ein Speicherleck melden

Warf
Beiträge: 2138
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Constructoren einer Klasse überladen

Beitrag von Warf »

Also bei ObjectPascal hat TObject (Die allgemeine Parentklasse) keinen eigenen konstruktor der überladen werden muss. Eine Klasse die von TObject abstammt muss den Konstruktor selbst implementieren wenn man ihn nutzen möchte.
Der Aufruf von Instanz.Create(Args); (z.B. Self.Create) erzeugt allerdings keine neue Instanz, da dies nur ein Methodenaufruf ist, der Aufruf von TKlasse.Create(Args) erzeugt eine neue Instanz. Syntaktisch und Semantisch ein sehr wichtiger Unterschied

mintpc
Beiträge: 124
Registriert: Mo 6. Sep 2010, 18:39
OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
CPU-Target: Win 7
Wohnort: Mailand

Re: Constructoren einer Klasse überladen

Beitrag von mintpc »

Perfekt! Vielen Dank für die Antworten, das ist genau das, was
ich wissen wollte.

mintpc

Antworten