Difference between revisions of "Przeciążanie destruktorów"
From MorphOS Library
(Translation started.) |
(Translation finished.) |
||
Line 1: | Line 1: | ||
''Grzegorz Kraszewski'' | ''Grzegorz Kraszewski'' | ||
---- | ---- | ||
− | <small>Ten artykuł w innych językach:[[ | + | <small>Ten artykuł w innych językach: [[Overriding Destructors|angielski]]</small> |
− | + | Jedynym zadaniem destruktora jest zwolnienie zasobów zarezerwowanych przez konstruktor i inne metody (niektóre zasoby mogą być alokowane na żądanie). W każdym przypadku destruktor musi zostawić obiekt w takim stanie jak zaraz po wywołaniu ''DoSuperMethod()/DoSuperNew()'' w konstruktorze. Następnie destruktor wywołuje destruktor w klasie nadrzędnej. Struktura parametrów destruktora jest pusta (zawiera tylko identyfikator metody). | |
− | |||
IPTR MyClassDispose(Class *cl, Object *obj, Msg msg) | IPTR MyClassDispose(Class *cl, Object *obj, Msg msg) | ||
Line 16: | Line 15: | ||
} | } | ||
− | + | Przykładowy destruktor powyżej jest kontynuacją przykładu konstruktora w artykule "[[Przeciążanie konstruktorów]]". Zwalnia trzy zasoby przydzielane w konstruktorze. Destruktor jest przygotowany na sytuację, gdy obiekt jest jedynie częściowo skonstruowany, wskaźnik na każdy zasób jest sprawdzany na okoliczność wartości zerowej. Jeżeli dla jakiegoś typu zasobów zero jest porpawnym identyfikatorem, najprościej dodać do danych obiektu flagę, która będzie pamiętała alokację danego zasobu. |
Latest revision as of 07:48, 26 January 2011
Grzegorz Kraszewski
Ten artykuł w innych językach: angielski
Jedynym zadaniem destruktora jest zwolnienie zasobów zarezerwowanych przez konstruktor i inne metody (niektóre zasoby mogą być alokowane na żądanie). W każdym przypadku destruktor musi zostawić obiekt w takim stanie jak zaraz po wywołaniu DoSuperMethod()/DoSuperNew() w konstruktorze. Następnie destruktor wywołuje destruktor w klasie nadrzędnej. Struktura parametrów destruktora jest pusta (zawiera tylko identyfikator metody).
IPTR MyClassDispose(Class *cl, Object *obj, Msg msg) { struct MyClassData *d = (struct MyClassData*)INST_DATA(cl, obj); if (d->ResourceA) FreeResourceA(); if (d->ResourceB) FreeResourceB(); if (d->ResourceC) FreeResourceC(); return DoSuperMethodA(cl, obj, msg); }
Przykładowy destruktor powyżej jest kontynuacją przykładu konstruktora w artykule "Przeciążanie konstruktorów". Zwalnia trzy zasoby przydzielane w konstruktorze. Destruktor jest przygotowany na sytuację, gdy obiekt jest jedynie częściowo skonstruowany, wskaźnik na każdy zasób jest sprawdzany na okoliczność wartości zerowej. Jeżeli dla jakiegoś typu zasobów zero jest porpawnym identyfikatorem, najprościej dodać do danych obiektu flagę, która będzie pamiętała alokację danego zasobu.