Wpis

Inteligentne wskaźniki

Dodano dnia 12 sierpnia 2009.

Inteligentne wskaźniki to bardzo pomocne twory. Dzięki nim nie trzeba pamiętać głównie o zwolnieniu obiektu w różnych przypadkach, a o błędy z tego wynikające nietrudno.

Istnieje masa różnych implementacji inteligentnych wskaźników, od najprostszych usuwających obiekt, na który wskazują w momencie kiedy jest usuwany obiekt wskaźnika lub przypisywana jest nowa wartość, poprzez zliczające, kopiujące i masę innych. Zależnie od funkcji jakie ma spełniać i do jakich celów mamy zamiar go używać każdy może przygotować własną implementację.

Najprostsza wersja może wyglądać tak:

template <class T>
class ptr {
   private:
      T* m_pointer;
      ptr(T& pointer) {}
      T& operator= (ptr& obj) {}
 
   public:
      ptr() : m_pointer(NULL) {}
      ptr(T* pointer) : m_pointer(pointer) {}
      ~ptr() { delete m_pointer; }
 
      T* operator-> () { return m_pointer; }
      T& operator* () { return *m_pointer; }
      T& operator= (T* pointer)
      {
         if (m_pointer != pointer)
         {
            delete m_pointer;
            m_pointer = pointer;
         }
      }
};

Może nie powala możliwościami, ale na pewno ułatwia pracę w wielu przypadkach. Po rozszerzeniu o kilka dodatkowych funkcji można np. ręcznie unieważniać wskaźnik (wraz z automatycznym usunięciem obiektu), sprawdzać jego poprawność, itd. Wszystko zależy od kreatywności i potrzeb programisty. :)

Więcej wraz z odnośnikami do różnych przykładowych implementacji można znaleźć w tekście Yonata Sharona Smart Pointers - What, Why, Which? lub po prostu googlając. Można także skorzystać z wielu gotowych implementacji dostarczanych przez różne biblioteki (np. Boost).

Dodaj komentarz.

Komentarze

Jeszcze nie ma żadnych komentarzy.
Twój może być pierwszy.

Dodaj komentarz

W komentarzach nie działają znaczniki HTML, nowe linie tworzone są po nacisnięciu Entera. Zamiast znaczników HTML możesz używać znaczników Textile.

Subskrypcje

Inne wpisy

Kategorie wpisu

Tagi wpisu