Zmienne, klasy, zasięg

0

Witam, mam problem z klasami w Delphi

var
  Form1: TForm1;
  elem:klasa;

implementation

{$R *.dfm}

procedure proba(el:klasa);
var
ellokal:klasa;
begin
ellokal:=klasa.Create;
ellokal:=el;
ellokal.pole:=2;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
elem:=klasa.Create;
elem.pole:=1;
showmessage(inttostr(elem.pole));
proba(elem);
showmessage(inttostr(elem.pole));
end;

end.

I teraz pytanie, dlaczego ten kod wyświetla najpierw jeden a potem 2, jak sprawić żeby zmienna elem.pole nie była zmieniana na 2?

0

nie przypisywać ellokal:=el;

0

No dobrze, ale do ellokal wczytuję el po to żeby robić coś z tym obiektem w obrębie funkcji. I dlaczego tak się dzieje, przecież do elem nic nie przypisuję.

0
newdelphi napisał(a)

do ellokal wczytuję el
nieprawda - najpierw przypisujesz wskaźnikowi el adres obiektu elem a następnie przypisujesz go do wskaźnika ellokal. Zmienna, która wskazuje na jakikolwiek obiekt jest tak naprawdę wskaźnikiem, tyle że nie trzeba dodawać daszka ^ za nazwą, a pamięć rezerwuje się nie przez new a przez TObject.Create a zwalnia nie przez dispose a przez free. Zmienna 'klasowa' zachowuje się dokładnie jak wskaźnik i im szybciej to zrozumiesz tym mniej będziesz miał problemów w przyszłości. Co więcej tutaj

ellokal:=klasa.Create;
ellokal:=el;

masz doskonały przykład jak nie należy postępować. Jest to wręcz książkowy przykład wycieku pamięci - po takiej operacji nie jesteś już w stanie zwolnić pamięci, którą zajmuje obiekt ellokal

0

Aha, wielkie dzięki, już czaję.

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