![]() |
[OOP]: Instanzierung ohne Konstruktoraufruf
Moin,
ich hab mir da mal ne ganz kleine Klasse geschrieben:
Delphi-Quellcode:
Soweit so gut. Folgende Form einer Anwendung verwendet dann diese Klasse:
unit Unit2;
interface type TMyClass = class(TObject) function add(a,b: Integer) :Integer; private { Private-Deklarationen } public { Public-Deklarationen } end; implementation function TMyClass.add(a,b: Integer) :Integer; begin result:= a+b; end; end.
Delphi-Quellcode:
Ich vestehe nicht, dass das so funktioniert, ich dachte immer, ich müsste zunächst ein Objekt der Klasse instanziieren, ehe ich damit arbeiten kann. Also irgendwie fehlt mit im obigen Code ein:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Unit2, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private addiere:TMyClass; { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin showMessage(IntToStr(addiere.add(1,6))); end; end.
Delphi-Quellcode:
Kann mir da mal jemand OOP-mäßig auf die Sprünge helfen?
addiere:= TMyClass.create
Gruß Gambit |
Re: Warum funzt dieser Code??
Hi,
der Compiler prüft nicht, ob die Klasse bereits instanziert wurde. In deinem Beispiel müsste der Zugriff auf "addiere" mit einer Zugriffsverletzung enden. mfG mirage228 |
Re: Warum funzt dieser Code??
Zitat:
Gruß Gambit |
Re: Warum funzt dieser Code??
Hallo,
alle Variablen die du verwendest gehören ja nicht zum Objekt - folglich kann er die Methode ohne Probleme abarbeiten. Wenn du noch ne Objekt-Variable c einführen würdest in der das Result zwischengespeichert werden soll, dann würde er auch rausfliegen. |
Re: Warum funzt dieser Code??
Zitat:
Du hast bei einem Objekt immer zwei Teile: Einen Teil, der nur die Daten hält. Für diesen Teil muss ein Speicherbereich reserviert werden, der später wieder freigegeben werden sollte (Objekt Instanzieren & Zerstören). Daneben gibt es aber noch den Codebereich. Der ist zur Laufzeit des Programmes immer an der gleichen Stelle, und wird auch nicht pro Objekt abgelegt sondern nur einmal pro Klasse. Da Deine Variable den Typ der Klasse hat, zeigen die Methoden der Klasse immer schon auf die richtige Stelle im Speicher. Bei jedem Methodenaufruf wird aber zusätzlich die 'Self-Referenz' übergeben. Das ist ein Pointer auf den Datenbereich des jeweiligen konkreten Objektes, und wird dazu verwendet, die verweise auf z.B. Variablen in dem Objekt aufzulösen. Bei Deinem Aufruf ist das Objekt nicht instanziert, die Self-Referenz ist also ungültig. Die Adresse der Methode selber nicht. Würdest Du nun versuchen, bei dem Aufruf auf eine Variable Deiner Klasse zuzugreifen, dann würde das nicht gehen, da Du aber keinen Teil aus dem Datenbereich benötigst, kann das Programm ohne auf einen nicht existenten Speicher zu benötigen problemlos weiterlaufen. Nachtrag: Mift.. schon wieder zu langsam :( |
Re: Warum funzt dieser Code??
Stimmt, ihr habt recht. :wall:
Also verhält sich diese Funktion "Addiere" doch wie eine class function oder? (Nur das man sie nicht mit TMyClass.addiere aufrufen kann) - Richtig? mfG mirage228 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:11 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