C++ Fabryka obiektów

Fabryki obiektów (object factory). Takie fabryki to najczęściej osobnej obiekty, które tworzą zależne od siebie byty np. na podstawie stałych wyliczeniowych, przekazywanych swoim metodom. Metody takie mogą więc zwrócić wiele różnych rodzajów obiektów, dlatego je się deklaruje się je z użyciem wskaźnikiem na klasy bazowe - u nas jest to IAnimal.


Prosty przykład:

#include <stdlib.h> // do rand() i srand()
#include <ctime> //do time()

IAnimal* StworzLosoweZwierze()
{
//zainicjalizowanie generatora liczb losowych
srand (static_cast<unsigned> (time(NULL));

//wylosowanie liczby i stworzenie obiektu zwierzę
switch (rand() %4)
{
  case 0: return new CFish;
  case 1: return new CMammal;
  case 2: return new CBird;
  case 3: return new CHomeDog;
  deafult: return NULL;
}


Wywołanie tej funkcji zwraca nam więc dowolną zwierzę i zawałoby się, że nijak nie potrafimy sprawdzić, do jakiej klasy ono fabrycznie należy. Z pomocą przychodzi nam operator  dynamic_cast, dzięki któremu możemy spróbować rzutowania otrzymanego wskaźnika na przykład do typu CMammal.





IAnimal* StworzLosoweZwierze()
CMammal* pSsak = dynamic_cast<CMammal*>(pZwierzę);
if (pSsak!= NULL)//sprawdzanie czy rzutowanie powiodło się lub if(pSsak)
{
//OK - rzeczywiście mamy do czynnienia z obiektem klasy CMammal. pSsak może być użyty tak
//samo, jak każdy inny wskaźnik na obiekt klasy CMammal, np.
pSsak -> Biegnij();
}


inaczej
if( CMammal* pSsak = dynamic_castt<CMammal*>(pZwierzę));


Kontrola otrzymanego wyniku rzutowania jest konieczna. Jeżeli bowiem spróbowaliśmy zastosować operator wyłuskania -> do pustego wskaźnika, spowodowaliśmy błąd ochrony pamięci (access violation)

Dlatego ważne jest sprawdzić czy rzutowanie dynamic_cast powiodło się, poprzez porównania otrzymanego wskaźnika z wartoscią NULL.

Komentarze

Popularne posty z tego bloga

Kubernetes

Helm

Ansible Tower / AWX