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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2010-07-02 09:17:28

  paoolo - Oldtimer

paoolo
Oldtimer
Skąd: Kraków
Zarejestrowany: 2006-05-20

[C++] Wirtualny destruktor

Hmm.. Mamy sobie dwie klasy, a raczej ich szblony jako podano poniżej

Kod:

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

Kod:

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

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)