[C++]Expression: list iterators incompatible
Ostatnio zmodyfikowano 2013-06-04 20:26
Sawair Temat założony przez niniejszego użytkownika |
[C++]Expression: list iterators incompatible » 2013-06-01 14:46:13 Podczas wywoływania tej funkcji w programie, po pierwszym if'ie wywala błąd z obrazku. void Mob::przeekwipuj() { char wybrany; int ktory; if( myZbroja != myPancerz.end() ) { myKp -= myZbroja->tyleKP(); } if( myTarcza != myPancerz.end() ) { myKp -= myTarcza->tyleKP(); myKpNPanc -= myTarcza->tyleKP(); } cout << "Przekwipowywujesz " << myName << endl << "Oto moje pancerze: \n"; wypisz_pancerze(); cout << "Wybierz pancerz, lub jesli nie ma, badz go nie chcesz wpisz \"X\": "; cin >> wybrany; if( wybrany != 'X' ) { ktory =( int ) wybrany; auto iElement = myPancerz.begin(); for( int i = 0; i < ktory; i++ ) { ++iElement; } myZbroja = iElement; myKp += myZbroja->tyleKP(); } cout << "Wybierz tacze, lub jesli jej nie ma, badz jej nie chcesz wpisz \"X\": "; cin >> wybrany; if( wybrany != 'X' ) { ktory =( int ) wybrany; auto iElement = myPancerz.begin(); for( int i = 0; i < ktory; i++ ) { ++iElement; } myTarcza = iElement; myKp += myTarcza->tyleKP(); myKpNPanc += myTarcza->tyleKP(); } }
Dodam jeszcze konstruktor obiektu: Mob::Mob( int itsNumer, string itsName, int itsKpNTarcz, list < Pancerz > & itsPancerz, list < Bron > & itsBron ) { myNumer = itsNumer; myName = itsName; myKpNTarcz = itsKpNTarcz; myKpNPanc = itsKpNTarcz; myKp = itsKpNTarcz; mynPancerzy = itsPancerz.size(); mynBroni = itsBron.size(); for( Pancerz & Element: itsPancerz ) { myPancerz.push_back( Element ); } for( Bron & Element: itsBron ) { myBron.push_back( Element ); } myZbroja = myPancerz.end(); myTarcza = myPancerz.end(); };
Tak więc jest ktoś w stanie mi powiedzieć gdzie jest błąd, że zawsze mi przed if'em wywala ten komunikat? |
|
Monika90 |
» 2013-06-01 15:09:42 Prawdopodobnie porównujesz iteratory, które należa do dwóch różnych list, albo jeden z nich jest nieważny. Ten kod nie wygląda dobrze: cin >> wybrany; if( wybrany != 'X' ) { ktory =( int ) wybrany; auto iElement = myPancerz.begin(); for( int i = 0; i < ktory; i++ ) { ++iElement; }
przesuwa on iterator o ilośc pozycji równą kodowi znaku wprowadzonego z klawiatury. |
|
Sawair Temat założony przez niniejszego użytkownika |
» 2013-06-01 15:30:40 Chodziło mi o pierwszego if'a. void Mob::przeekwipuj() { char wybrany; int ktory; if( myZbroja != myPancerz.end() ) { myKp -= myZbroja->tyleKP(); }
Ma on sprawdzić czy iterator wskazuje jakiś element listy myPancerz i od zmiennej Mob'a odjąć wartość zwracana przez funkcje tyleKP(). Za każdym razem kiedy element spod iteratora jest usuwany, myZbroja wskazuje koniec listy myPancerz. A tak w ogóle to iterator w tym miejscu jest użyty po raz 2, tz po wywołaniu konstruktora wywołuję funkcje przeekwipuj()... |
|
DejaVu |
» 2013-06-04 20:26:14 Możliwe warianty zostały wymienione przez @Monika90. Być może gdzieś kopiujesz listę albo robisz inne dziwne rzeczy, które sprawiają, że Twój iterator jest niepoprawny. |
|
« 1 » |