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

[C++] Kontenery: lista zawierająca listy obiektów klasy

Ostatnio zmodyfikowano 2013-05-05 19:50
Autor Wiadomość
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:
C/C++
list < list < figura *>> figury; //tu tworze listę nadrzędna
list < figura *> trojkaty; //tu tworze listy podrzędne
list < figura *> kwadraty;
list < figura *> czworokaty;
list < figura *> osmiokaty;

figury.push_back( trojkaty ); // tu dodaje listy do nadrzędnej
figury.push_back( kwadraty );
figury.push_back( czworokaty );
figury.push_back( osmiokaty );

...

list < list < figura *>>::iterator it1 = figury.begin(); //tworze iterator do listy list
for( int i = 1; i < b; i++ ) // przesuwam iterator na żądaną pozycję
{
    it1++;
}
trojkat * k; //tworzę obiekt i dodaję go do list podrzędnej
( * it1 ).push_back( k = new trojkat() );
delete k;
// nie wiem, czy teraz nie powinienem aktualizować listy list

...

list < list < figura *>>::iterator it1 = figury.begin(); // jak wyżej iterator listy list
for( int i = 1; i < c; i++ )
{
    it1++;
}

list < figura *>::iterator it2 =( * it1 ).begin(); // tu iterator listy podrzędnej
for( int i = 1; i < d; i++ )
{
    it2++;
}
( * it2 )->pole(); // przy debagowaniu tu wyskakuje okienko z błędem

To chyba tyle, jeśli coś rozjaśnić, to proszę pytać.
P-82016
pekfos
» 2013-05-04 17:12:50
C/C++
trojkat * k; //tworzę obiekt i dodaję go do list podrzędnej
( * it1 ).push_back( k = new trojkat() );
delete k; // ..A tu go usuwasz..
P-82017
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.
P-82020
pekfos
» 2013-05-04 17:28:27
To tak nie działa.
P-82022
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.
P-82023
pekfos
» 2013-05-04 17:32:36
żeby lista przechowywała obiekty
Nie definiuj jej, jako przechowującej wskaźniki na obiekty.
P-82024
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:

C/C++
trojkat * k; //tworzę obiekt i dodaję wskaźnik(zamiast obiekt) do list podrzędnej
( * 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>        ]
P-82025
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.
P-82037
« 1 » 2
  Strona 1 z 2 Następna strona