borgaz Temat założony przez niniejszego użytkownika |
[C++] Kontenery: lista zawierająca listy obiektów klasy » 2013-05-04 17:10:07 Witam. Mam trudną sytuację z programem, ponieważ wszystko się kompiluje. Visual w odpowiednich miejscach podpowiada odpowiednie metody, co wskazuje, że dane elementy traktuje w odpowiedni sposób. Jednak podczas działania programu wyskakuje komunikat: 0xC0000005: Access violation reading location 0xfeeefeee. Oto fragmenty kodu, w których wydaje mi się, że powinien być błąd, jednak nie wiem jaki: list < list < figura *>> figury; list < figura *> trojkaty; list < figura *> kwadraty; list < figura *> czworokaty; list < figura *> osmiokaty;
figury.push_back( trojkaty ); figury.push_back( kwadraty ); figury.push_back( czworokaty ); figury.push_back( osmiokaty );
...
list < list < figura *>>::iterator it1 = figury.begin(); for( int i = 1; i < b; i++ ) { it1++; } trojkat * k; ( * it1 ).push_back( k = new trojkat() ); delete k;
...
list < list < figura *>>::iterator it1 = figury.begin(); for( int i = 1; i < c; i++ ) { it1++; }
list < figura *>::iterator it2 =( * it1 ).begin(); for( int i = 1; i < d; i++ ) { it2++; } ( * it2 )->pole();
To chyba tyle, jeśli coś rozjaśnić, to proszę pytać. |
|
pekfos |
» 2013-05-04 17:12:50 trojkat * k; ( * it1 ).push_back( k = new trojkat() ); delete k;
|
|
borgaz Temat założony przez niniejszego użytkownika |
» 2013-05-04 17:22:49 Myślałem, że obiekt zostanie zapisany na liście i nie potrzebuję wtedy tego obiektu k. Dlatego go usunąłem. |
|
pekfos |
» 2013-05-04 17:28:27 To tak nie działa. |
|
borgaz Temat założony przez niniejszego użytkownika |
» 2013-05-04 17:31:32 To w takim razie jak to rozwiązać, żeby lista przechowywała obiekty. |
|
pekfos |
» 2013-05-04 17:32:36 żeby lista przechowywała obiekty |
Nie definiuj jej, jako przechowującej wskaźniki na obiekty. |
|
borgaz Temat założony przez niniejszego użytkownika |
» 2013-05-04 17:44:14 Dobra chyba załapałem błąd w moim rozumowaniu. Mogę przechowywać wskaźniki na obiekty, ale wtedy nie mogę usuwać tego obiektu, a tu powinien być inny komentarz: trojkat * k; ( * it1 ).push_back( k = new trojkat() ); delete k;
Moim celem jest dojście do tego, bym mógł korzystać z listy jak z tablicy, czyli każdy element z list podrzędnych mógł być używany jak obiekt(albo wskaźnik na obiekt, ale wtedy jak rozumiem powinien wyć ten obiekt wciąż gdzieś w pamięci, czyli nie można go wtedy deletem traktować od razu). Ale jak w takim razie osiągnąć ten cel? edit: Myślę, że istotnym elementem będzie to, gdy dodam, że figura to klasa abstrakcyjna, a klasy trojkat, czworokat i osmiokat dziedziczą po niej, a kwadrat dziedziczy po czworokat. Poza tym po skasowaniu gwiazdek (czyli deklaracji na obiekty, a nie wskaźniki) wywala błąd kompilacji: error C2259: 'figura' : cannot instantiate abstract class 1> due to following members: 1> 'void figura::pokaz_w(void)' : is abstract 1> d:\kuba\documents\moje studia\programowanie\1po\1laboratoria\laboratoria 7\zadanie 7_1\zadanie 7_1\figura.h(11) : see declaration of 'figura::pokaz_w' 1> 'void figura::licz_obwod(void)' : is abstract 1> d:\kuba\documents\moje studia\programowanie\1po\1laboratoria\laboratoria 7\zadanie 7_1\zadanie 7_1\figura.h(12) : see declaration of 'figura::licz_obwod' 1> 'double figura::pole(void)' : is abstract 1> d:\kuba\documents\moje studia\programowanie\1po\1laboratoria\laboratoria 7\zadanie 7_1\zadanie 7_1\figura.h(13) : see declaration of 'figura::pole' 1> d:\kuba\documents\moje studia\programowanie\1po\1laboratoria\laboratoria 7\zadanie 7_1\zadanie 7_1\zadanie 7_1.cpp(19) : see reference to class template instantiation 'std::list<_Ty>' being compiled 1> with 1> [ 1> _Ty=figura 1> ]
|
|
pekfos |
» 2013-05-04 20:12:52 Myślę, że istotnym elementem będzie to, gdy dodam, że figura to klasa abstrakcyjna, a klasy trojkat, czworokat i osmiokat dziedziczą po niej, a kwadrat dziedziczy po czworokat. Poza tym po skasowaniu gwiazdek (czyli deklaracji na obiekty, a nie wskaźniki) wywala błąd kompilacji: |
W tym przypadku musisz używać wskaźników. |
|
« 1 » 2 |