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/.



Oldtimer




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