In deinem Beispiel ist es ein Problem.
MyClass ist ja nur ein Zeiger auf eine Instanz deiner Klasse. Letztenendes ist es nur ein Record, welches als erstes Element einen Zeiger auf die Klasse (also die
RTTI) hat.
Ein Objekt besteht ja immer aus dem Bauplan (die
RTTI) und den Methoden der Klasse. Die gibts in jedem Programm nur einmal. Und dann gibts eben noch die Instanz, was im Prinzip der oben beschriebene Record ist.
Rufst du jetzt zweimal einen Constructor mit TmyClass.Create auf (also so dass innerhalb des constructors ClassCreate aufgerufen wird) bekommst du jedes Mal einen Zeiger auf das neue Record zurück. Dadurch dass die zwei Constructoren unterschiedlich sind, sind die Records womöglich unterschiedlich initialisiert (je nachdem, was in dem jeweiligen Constructor drin steht).
In deinem Besipiel überschreibst du den Zeiger auf den ersten Record und bekommst dadurch ein Speicherloch (du kannst den Speicher nicht mehrfreigeben, da du nicht mehr weist, wo er ist). Und bei einem Speicherloch meckert kein compiler und auch kein Processor und auch kein Windows. Ausser es ist dann irgendwann nach vielen Aufrufen kein freier Speicher mehr da.
Speichertechnisch gleiches erriechst du mit folgendem Code:
Delphi-Quellcode:
type PmyInstance=^TmyInstance;
TmyInstance=record
RTTI:pointer;
// der besagte erste Zeiger auf die RTTI
fCreated:Tdatetime;
end;
...
procedure inita(Instance:PmyInstance);
begin
Instance.fcreated:=now;
end;
procedure initb(Instance:PmyInstance;int:integer);
begin
Instance.fcreated:=now+int;
end;
var myInstance:PmyInstance;
begin
new(myInstance);
inita(myInstance);
new(myInstance);
initb(myInstance);
dispose(myInstance);
end;
Ist fast dasselbe wie
OOP, nur dass hier keine Veerbung, Polymorphie, etc. möglich ist. Und daran siehst du auch, warum man new und init zu einem Constructor zusammengefasst hat. Und du siehst auch, dass ich den Speicher vom ersten "new" nicht mehr freigeben kann.
Was man aber an deinem Code machen kann, ist den zweiten Constructor als normale Methode aufzurufen (param2=0):
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
MyClass: TMyClass;
begin
MyClass := TMyClass.CreateA;
try
ShowMessage(DateToStr(MyClass.getCreated));
MyClass.CreateB(10); //hier ist der Unterschied, CreateB wird als normale Methode aufgerufen (ohne ClassCreate)
ShowMessage(DateToStr(MyClass.getCreated));
except
MyClass.Free;
end;
end;
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.