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

Odpowiedz Nowy wątek
2017-05-13 15:02
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--;}
};
edytowany 1x, ostatnio: fasolus, 2017-05-13 15:16

Pozostało 580 znaków

2017-05-13 15:32
4

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

int Wektor2D::Licznik = 0;

Asm/C/C++
edytowany 1x, ostatnio: mwl4, 2017-05-14 22:27
Działa dzięki ;) - fasolus 2017-05-13 15:40

Pozostało 580 znaków

2017-05-14 22:16
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ć ?

edytowany 1x, ostatnio: fasolus, 2017-05-14 22:17

Pozostało 580 znaków

2017-05-14 22:23

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


Asm/C/C++
edytowany 1x, ostatnio: mwl4, 2017-05-14 22:24
fakt. Virtual wkradł się przypadkiem z programu przed pewną modyfikacją. Wszystko działa dzięki ;) - fasolus 2017-05-14 22:55

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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