Wątek przeniesiony 2014-05-17 23:47 z Delphi i Pascal przez furious programming.

Kiedy jest wykonywany konstruktor?

0

Zawsze używałem w Pascalu typów obiektowych ( object ), mam sporo napisanych programów i teraz próbuje to przełozyć na typy z klasami ( class ). Przeczytałem trochę manuali do FPC, ale ciągle mam dosyć podstawowe problemy. W klasie moga być dwa rodzaje konstruktorów. Pierwszy, deklarowany ze słówkiem class :

type MyClass = class
           class constructor Create;
end;
class constructor MyClass.Create;
begin
 writeln('startuję konstruktor...');
end;

to działa tak jak oczekiwałem, program wywołuje ten konstruktor przy swoim starcie, nawet gdy nie deklaruję żadnej zmiennej tej klasy. A teraz przypadek, którego nie rozumiem - bardzo podobny:

type MyClass = class
           constructor Create;
end;
constructor MyClass.Create;
begin
 writeln('startuję konstruktor...');
end;

i tutaj oczekiwałbym, że kod

var M:MyClass;
begin
  M.Create; // jawne wywołanie konstruktora ??

w momencie, gdzie jest wołany konstruktor wypisze mi komunikat na ekranie. A tak się nie dzieje. Ten komunikat nie pojawia sie do końca programu w ogóle. Nie wywołuje on tego mojego konstruktora ?

Pomóżcie mi dowiedzieć się czego nie zrozumiałem ?

3

Po pierwsze, to wypadałoby zadeklarować publiczny konstruktor, a po drugie tak się instancji klas nie tworzy, bo referencję do niej wypada wpisać do zmiennej, aby ją następnie użyć do dealokacji pamęci obiektu... Przeczytaj jakiś kurs z podstawami programowania obiektowego;

Poprawny będzie poniższy zapis:

type
  TMyClass = class(TObject)
  public
    constructor Create();
  end;

  constructor TMyClass.Create();
  begin
    Write('constructor of TMyClass');
  end;

var
  mcTest: TMyClass;
begin
  mcTest := TMyClass.Create(); // utworzenie obiektu
  try
    // wykorzystanie instancji klasy
  finally
    mcTest.Free(); // zwolnienie obiektu z pamięci
  end;
  ReadLn;
end.

ewentualnie referencję do utworzonego obiektu może także trzymać instrukcja wiążąca With, dzięki czemu zmienna nie będzie potrzebna:

with TMyClass.Create() do
try
  // wykorzystanie obiektu
finally
  Free();
end;

Tyle że w takim przypadku tworzona instancja klasy musi być zwolniona z pamęci w związanym bloku kodu, bo inaczej utracisz do niej referencję i wyciek pamięci gotowy;

A wątek ląduje w dziale Newbie, dlatego że dotyczy podstaw programowania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1