Błąd przy inkrementowaniu wewnątrz konstruktora i destruktora

0

Witam. Potrzebuję zliczać tworzone w programie obiekty klasy Wektor2D. Jednak gdy w definicji konstruktora lub destruktora odwołam się do pola Licznik w następujący sposób:

Wektor2D(){Licznik;}

to program działa i kompiluje się poprawnie.
Jednak gdy chcę zwiększać Licznik, w następujący sposób:

Wektor2D(){++Licznik;}

wyskakują jakieś dziwne błędy związane z linkowaniem

class Wektor2D {
private:
    /*!
     * \brief Zawartosc Wektora2D
     *
     * Pole zawiera dwie liczby bedace wspolrzednymi
     * Wektora2D
     */
    double _Tab2D[2];
protected:
    static int Licznik;
    
  public:
    /*!
     * \brief Uzyskuje dostep do pola
     */
    double operator[](int i) const {return _Tab2D[i];}
    /*!
     * \brief Uzyskuje dostep do pola i pozwala na jego modyfikacje
     */
    double &operator[](int i) {return _Tab2D[i];}
    /*!
     * \brief Dokonuje translacji o W_translacji
     */
    Wektor2D operator+(const Wektor2D &W_translacji);
    /*!
     * \brief Dokonuje translacji o W_translacji
     */
    Wektor2D operator-(const Wektor2D &W_translacji);
    /*!
     * \brief Wstawia poczatkowe wspolrzedne wektora
     */
    void WstawPoczatkoweWspolrzedne(double i,double j);
    /*!
     * \brief Wpisuje wspolrzedne z wejscia standardowego
     */
    friend istream& operator >> (istream &Strm, Wektor2D &Wek);
    /*!
     * \brief Wypisuje wspolrzedne na wyjscie standardowe
     */
    friend ostream& operator << (ostream &Strm, const Wektor2D &Wek);
    
    int static WezLicznik(){return Licznik;}
    Wektor2D(){Licznik++;}
    virtual ~Wektor2D(){Licznik--;}
};
4

Musisz w jednym pliku .cpp zdefiniować Wektor::Licznik w taki sposób:

int Wektor2D::Licznik = 0;
0

Panie i Panowie pojawił się niestety kolejny kłopot. Jak to możliwe, że destruktor wykonuje się więcej razy niż konstruktor ?

Wektor2D(){Licznik++;}
virtual ~Wektor2D(){Licznik--;}

Przy samym starcie programu zmienna Licznik ma ujemną wartość. O co może chodzić ?

1

Jeśli kopiujesz obiekt ( i nie definiujesz własnego konstruktora kopiującego ) to konstruktor domyślny nie jest wywoływany.

Aby to zrobić trzeba właśnie zdefiniować własny konstruktor kopiujący ( i ewentualnie przenoszący ):

Wektor2D(Wektor2D const &r) // konstruktor kopiujący
	: Wektor2D()
{
	_Tab2D[0] = r._Tab2D[0];
	_Tab2D[1] = r._Tab2D[1];
}

Wektor2D(Wektor2D &&r) // konstruktor przenoszący [C++11]
	: Wektor2D()
{
	_Tab2D[0] = std::move(r._Tab2D[0]);
	_Tab2D[1] = std::move(r._Tab2D[1]);
}

Poza tym, u ciebie nie trzeba destruktora wirtualnego (no chyba, że dziedziczysz po Wektor2D ale to bezsens).

1 użytkowników online, w tym zalogowanych: 0, gości: 1