Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Przy używaniu metody biblioteki <vector> - push_back - konstruktory i dekonstruktory obiektow nie są wywoływane lub są wywoływane nieprawidłowo

Ostatnio zmodyfikowano 2017-05-17 18:55
Autor Wiadomość
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 ?
P-160854
1aam2am1
» 2017-05-08 19:08:32
Konstruktor kopiujący masz?
P-160855
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.
P-160856
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
C/C++
class Objekt
{
protected:
    static int ilosc_obiektow; //licznik utworzonych obiektow
    ZbiorWierzcholkow zbior; //Zbior wierzcholkow obiektu. Wierzcholki zapisane sa wzgledem punktu (0,0). zwroc_obiekt() zwraca je wzgledem pozycji
    Wektor pozycja; //Pozycja obiektu. Wierzcholki zwracane sa wzgledem pozycji za pomoca metody zwroc_obiekt() lub zwroc_punkt()
public:
    Objekt( Wektor[], int, Wektor );
    Objekt();
    ~Objekt();
   
    void wyswietl(); //Wyswietla wierzcholki i pozycje obiektu
    void przesun( Wektor );
    void obroc( float );
    int ile_wierzcholkow();
    Wektor zwroc_punkt( int ); //Zwraca wspolrzedne danego wierzcholka na odpowiedniej pozycji
   
    vector < Wektor > zwroc_obiekt(); //zwraca wszystkie wierzcholki obiektu na odpowiedniej pozycji
   
   
};

objekt.cpp
C/C++
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
C/C++
#include "Objekt.h"
class Przeszkoda
    : public Objekt
{
    static int ilosc_przeszkod;
public:
    Przeszkoda( Wektor[], int, Wektor );
    ~Przeszkoda();
   
    int ile_przeszkod();
};

Przeszkoda.cpp
C/C++
#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
C/C++
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 ); //dodaje przeszkode na podstawie tablicy punktow, int to ilosc wczytanych punktow i wektor pozycji obiektu na scenie
    void dodaj_robota( Wektor ); //dodaje robota na danej pozycji
    void ruch_kamery( Wektor ); //odpowiada za ruch kamery
};

Scena.cpp
C/C++
#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
C/C++
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
P-160869
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.
P-160871
mateczek
» 2017-05-08 23:09:55
C/C++
void Scena::dodaj_przeszkode( Wektor tab[], int ilosc_wierzcholkow, Wektor pozycja )
{
    Przeszkoda tmp( tab, ilosc_wierzcholkow, pozycja ); // konstruktor temp licznik++
    zbior_przeszkod.push_back( tmp ); //konstruktor kopiujący obiekt nie zliczony
} // destruktor temp licznik --
P-160872
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.

P-160987
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?
P-160990
« 1 » 2
  Strona 1 z 2 Następna strona