Draexis Temat założony przez niniejszego użytkownika |
Problem z tworzeniem wielu obiektów klasy z dynamiczna tablica » 2018-05-11 22:23:06 Witam :) Jestem początkującym programistą. Stworzyłem klasę Cont, która zawiera dwuwymiarową tablicę dynamiczną. Problem pojawia się kiedy chcę stworzyć tablicę tych obiektów za pomocą pętli for. Klasa wygląda tak: class Cont { public: int rows; int columns; int ** space; static int l; const int id; std::time_t t; Cont(); Cont( int X, int Z, std::time_t Y ); ~Cont(); };
Cont::Cont() : id( l ) { l++; int * space = NULL; }
Cont::Cont( int X, int Z, std::time_t Y ) : id( l ) { t = Y; l++; rows = X; columns = Z; space = new int *[ X ]; for( int i = 0; i < X; i++ ) space[ i ] = new int[ Z ]; }
Cont::~Cont() { for( int i = 0; i < rows; i++ ) delete[] space[ i ]; delete[] space; }
int Cont::l = 1;
Program wysypuje się jeśli np. wpiszę Cont Kont[ 5 ]; Podpowie ktoś co jest nie tak? Z góry dziękuję. :) |
|
pekfos |
» 2018-05-11 22:48:32 Co to ma być? Cont::Cont() : id( l ) { l++; int * space = NULL; } |
|
Draexis Temat założony przez niniejszego użytkownika |
» 2018-05-11 23:18:38 Konstruktor domyślny przypisujący zmiennej id wartość zmiennej l oraz zwiększający wartość zmiennej l o 1 oraz ustawiający wskaźnik na NULL. Tutaj tkwi problem? Możesz wytłumaczyć bo nie rozumiem? |
|
pekfos |
» 2018-05-11 23:41:42 Opisałeś cały fragment, chociaż miałeś oznaczoną jedną linię. Może nie zauważyłeś komentarza, tak samo jak nie zauważyłeś, że w oznaczonej linii użyłeś zupełnie innej składni, niż wszędzie indziej, gdzie "ustawiasz wartość"? |
|
YooSy |
» 2018-05-12 00:01:48 Tworzysz lokalny wskaźnik, który jest niszczony po wyjściu ze scopa, natomiast pole klasy, które (wydaje ci się ustawiasz) jest nietknięte.
|
|
Draexis Temat założony przez niniejszego użytkownika |
» 2018-05-12 00:09:14 Zauważyłem komentarz ale opisałem wszystko bo nie wiedziałem co w tym może być nie tak. Teraz natomiast dopiero zauważyłem gdzie był błąd. Po poprawieniu wygląda to tak ale program dalej się sypie: Cont::Cont() : id( l ) { l++; space = NULL; }
Dziękuję za poprawkę ale problem nadal występuje. Co jeszcze może być nie tak? Docelowo chciałbym żeby dało się napisać coś takiego : Cont Kont[ z ]; for( int i = 0; i < z; i++ ) { Kont[ i ] = Cont( wymiary[ i ][ 0 ], wymiary[ i ][ 1 ], t[ i ] ) }
Potrzebuję to tak napisać, ponieważ wymiary kontenerów oraz timestamp wyciągam z pliku tekstowego do zmiennych a tych kontenerów ma być około 1000 więc tworzenie każdego obiektu osobno jest bez sensu. Dzięki z góry za pomoc :) |
|
pekfos |
» 2018-05-12 00:42:40 Użyj std::vector<>, nie tablicy i/lub zaimplementuj poprawne kopiowanie/przenoszenie obiektów klasy. Samo utworzenie tablicy się sypie, bo konstruktor domyślny nie inicjalizuje wszystkich używanych zmiennych. |
|
Draexis Temat założony przez niniejszego użytkownika |
» 2018-05-12 13:42:54 Chodzi o coś takiego? class Cont { public: int rows; int columns; int ** space; std::time_t t; Cont( int X, int Z, std::time_t Y ); ~Cont(); };
Cont::Cont( int X, int Z, std::time_t Y ) { t = Y; rows = X; columns = Z; space = new int *[ X ]; for( int i = 0; i < X; i++ ) space[ i ] = new int[ Z ]; }
Cont::~Cont() { for( int i = 0; i < rows; i++ ) delete[] space[ i ]; delete[] space; }
Usunąłem z klasy konstruktor domyślny a także zmienną l oraz id. vector < Cont > Kont; for( int i = 0; i < n; i++ ) { Kont.push_back( Cont( wymiary[ i ][ 0 ], wymiary[ i ][ 1 ], t[ i ] ) ); }
Powyżej jak próbowałem użyć vector ale niestety program dalej się sypie. Nie o to chodziło czy coś jest nie tak? |
|
« 1 » 2 |