Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Hmm.. Mamy sobie dwie klasy, a raczej ich szblony jako podano poniżej
template<typename T> class Array { protected: int size; T* array; public: Array(int); virtual ~Array(); Array(const Array&); Array& operator=(const Array&); /* ... */ virtual Array<T>& range(int,int); virtual int getLeft(); virtual int getRight(); int length(); friend ... }; template<typename T> class SmtArray : public Array<T> { int *quant, left, right; public: SmtArray(int); ~SmtArray(); SmtArray(const SmtArray&); SmtArray& operator=(const SmtArray&); /* ... */ virtual SmtArray<T>& range(int,int); virtual int getLeft(); virtual int getRight(); int length(); friend ... };
gdzie jak widać SmtArray<T> dziedziczy z Array<T> oraz posiada wirtualne metody. SmtArray<T> posiada ruchome granice w zakresie tablicy (taka jakaś konstrukcja narzuciła mi się przy obsłudze sortowania). Domyślną polityką Array<T> przy kopiowaniu obiektu, jest przekopiowanie całości tablicy od 0 do size-1, zaś w przypadku SmtArray<T> jest tylko przepisanie wskaźnika do tablicy oraz zwiększenie licznika wykorzystań tablicy (aby gdy ostatni obiekt klasy SmtArray<T> usuwał się to i usunął tablicę). Problemem jest jednak usuwanie tablicy, jakie jest zaimplementwane wew. Array<T>, co widać ponizej
template<typename T> Array<T>::~Array() { if(array) delete [] array; } /* ... */ template<typename T> SmtArray<T>::~SmtArray() { (*quant)--; if(!(*quant)) { delete [] this->array; this->array = NULL; delete quant; } }
Gdy istnieje tylko jeden obiekt klasy SmtArray<T> to jest okey (nie rzuca błędu związanego z podwójnym zwalnianiem, ale takowy był :). Jednak jak skopiuje obiekt (np. przekazując przez referencję do funkcji sortującej), to owszem, zawoła się detruktor ~SmtArray<T> (polimorfizm), ale także niechciany w tym przypadku ~Array<T>.
I rozumiem, że nie bardzo się da to ominąć?
EDIT: dobra znalazłem obejście. Trza będzie się nieco pobawić w dziedziczenie, etc.
Ostatnio edytowany przez paoolo (2010-07-02 11:07:52)
Offline