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:[[Overloading destructors|angielski]]</small>
+
<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).
The only task of a destructor is freeing resources allocated by the constructor and other methods (some resources may be allocated on-demand only). In any case the destructor must leave the object in the same state as right after ''DoSuperMethod()/DoSuperNew()'' in the constructor. After that the destructor calls a super class destructor. The destructor receives an empty message.
 
  
 
  IPTR MyClassDispose(Class *cl, Object *obj, Msg msg)
 
  IPTR MyClassDispose(Class *cl, Object *obj, Msg msg)
Line 16: Line 15:
 
  }
 
  }
  
The example destructor follows the example of the constructor in the [[Overriding Constructors]] article. Three resources obtained in the constructor are freed here. The destructor is also prepared for a partially constructed object, every resource is checked against ''NULL'' before freeing. If for some type of resource NULL is a valid handle, an additional flag may be added to the object instance data area.
+
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.