kkamil4sz Temat założony przez niniejszego użytkownika |
Przy używaniu metody biblioteki <vector> - push_back - konstruktory i dekonstruktory obiektow nie są wywoływane lub są wywoływane nieprawidłowo » 2017-05-08 19:03:10 Mam taki dziwny problem, że gdy tworzę obiekty jakiejś klasy normalnie, to konstruktory i dekonstruktory poprawnie są wywoływane zwiększając lub zmniejszając zmienną statyczną liczba_objektow , natomiast gdy tworze obiekty w tablicy obiektów < vector > to liczba_obiektow spada poniżej zera. Jeśli raz użyję push_back to kończę z wartością -1, przy dwóch użyciach jest -3, potem -6 i -10. Pojawia się ta dziwna zależność. Jest to bardzo dziwne, skoro w KAŻDYM konstruktorze i dekonstruktorze mam odpowiednią inkrementację i dekrementację tej wartości, to zawsze powinno to poprawnie liczyć. Z resztą gdyby z konstruktorami było coś nie tak, to problem występowałby też przy normalnym tworzeniu obiektów, a jak już mówiłem występuje jedynie przy użyciu metody push_back z biblioteki < vector > z STL. Czy możliwe jest, żeby biblioteka wpływała na konstruktory i dekonstruktory ? |
|
1aam2am1 |
» 2017-05-08 19:08:32 Konstruktor kopiujący masz? |
|
michal11 |
» 2017-05-08 19:12:06 Bez kodu można tylko zgadywać, ale prędzej zakładałbym błąd w twoim kodzie niż w kodzie STL'a. |
|
kkamil4sz Temat założony przez niniejszego użytkownika |
» 2017-05-08 22:26:41 Co to jest konstruktor kopiujący ? Z tego co znalazłem w internecie to wygląda jak zwykły konstruktor z parametrami ? KOD (starałem się tylko ważne fragmenty skopiować):Objekt.h class Objekt { protected: static int ilosc_obiektow; ZbiorWierzcholkow zbior; Wektor pozycja; public: Objekt( Wektor[], int, Wektor ); Objekt(); ~Objekt(); void wyswietl(); void przesun( Wektor ); void obroc( float ); int ile_wierzcholkow(); Wektor zwroc_punkt( int ); vector < Wektor > zwroc_obiekt(); };
objekt.cpp int Objekt::ilosc_obiektow = 0;
Objekt::Objekt( Wektor tab[], int liczba, Wektor pos ) { zbior.wczytaj( tab, liczba ); pozycja = pos; ilosc_obiektow++; }
Objekt::Objekt() { ilosc_obiektow++; }
Objekt::~Objekt() { ilosc_obiektow--; }
Przeszkoda.h #include "Objekt.h" class Przeszkoda : public Objekt { static int ilosc_przeszkod; public: Przeszkoda( Wektor[], int, Wektor ); ~Przeszkoda(); int ile_przeszkod(); };
Przeszkoda.cpp #include "Przeszkoda.h"
int Przeszkoda::ilosc_przeszkod = 0;
Przeszkoda::Przeszkoda( Wektor tab[], int liczba, Wektor pos ) : Objekt( tab, liczba, pos ) { ilosc_przeszkod++; }
Przeszkoda::~Przeszkoda() { ilosc_przeszkod--; }
int Przeszkoda::ile_przeszkod() { return ilosc_przeszkod; }
Scena.h class Scena { public: std::string flo2str( float ); std::vector < Przeszkoda > zbior_przeszkod; std::vector < Robot > zbior_robotow; Wektor przesuniecie_kamery; public: Scena(); ~Scena(); void dodaj_przeszkode( Wektor[], int, Wektor ); void dodaj_robota( Wektor ); void ruch_kamery( Wektor ); };
Scena.cpp #include "Scena.h"
Scena::Scena() { dodaj_robota( Wektor( 0, 0 ) ); }
Scena::~Scena() { }
void Scena::dodaj_przeszkode( Wektor tab[], int ilosc_wierzcholkow, Wektor pozycja ) { Przeszkoda tmp( tab, ilosc_wierzcholkow, pozycja ); zbior_przeszkod.push_back( tmp ); }
void Scena::dodaj_robota( Wektor pozycja ) { zbior_robotow.push_back( Robot( pozycja ) ); }
Przykladowo: main.cpp Wektor a( 2, 3 ); Wektor b( 1, 5 ); Wektor x( 4, 8 ); Wektor tab[] = { a, b };
Scena scena;
scena.dodaj_przeszkode( tab, 2, x );
Wszystko aktualnie mam w lekkim chaosie bo jestem w środku prac nad tym :P |
|
DejaVu |
» 2017-05-08 23:05:27 Piszesz poza zakresem tablicy. Zwykłe tablice nie są rozszerzalne.
/edit: A w zasadzie to nie wiadomo co robisz. Wiadomo, że kod jest zdecydowanie przekombinowany. push_back działa zawsze prawidłowo, więc problem leży w zupełnie innym miejscu. |
|
mateczek |
» 2017-05-08 23:09:55 void Scena::dodaj_przeszkode( Wektor tab[], int ilosc_wierzcholkow, Wektor pozycja ) { Przeszkoda tmp( tab, ilosc_wierzcholkow, pozycja ); zbior_przeszkod.push_back( tmp ); }
|
|
kkamil4sz Temat założony przez niniejszego użytkownika |
» 2017-05-12 11:33:43 @DejaVu: Gdzie wychodze po za zakres ? Ale tak czy inaczej nie mogę zrozumieć czemu destruktory są wywoływane więcej razy niż jest obiektów. @mateczek: Mógłbyć coś więcej wyjaśnić ?
Kolega ma podobny problem, też użył tablicy dynamicznej vector.
|
|
Monika90 |
» 2017-05-12 11:53:22 Kompilator stworzył dla ciebie w klasie Obiekt konstruktor kopiujący, ten konstruktor jest używany przez push_back (i nie tylko), ale konstruktor ten nie zwiększa wartości zmiennej ilosc_obiektow. Musisz więc napisać samemu konstruktor kopiujący, który będzie to robił.
Jest też prostsze rozwiązanie: nie licz obiektów w ogóle, bo po co ci to? |
|
« 1 » 2 |