2012-03-30 5 views
5

nie mam vector która posiada wskaźniki do abstrakcyjnego typu Rock:iteracja błędu wektor przyczyna ale średnia dla pętli nie

vector<Rock*> rocks; 

Gdybym pętli wektora z iteratora, a następnie spróbuj uzyskać dostęp do przedmiot (nie-klasa abstrakcyjna, która rozciąga Rock) poprzez iterator, pojawia się błąd „” EXC_BAD_ACCESS w Xcode 4:

vector<Rock*>::iterator rockIter; 
for (rockIter = rocks.begin(); rockIter != rocks.end(); ++rockIter) 
{ 
    bullet.hit(*(*rockIter)); 
} 

Ale przelotowego normalnie jak ma problemu:

for (int i = 0; i < rocks.size(); i++) 
{ 
    bullet.hit(*rocks[i]); 
} 

Funkcja hit() wygląda następująco:

bool Bullet::hit(Rock & rock) 

Myślałem, że *(*rockIter) i *rock[i] zrobi to samo, ale oczywiście oni nie. Co jest innego i jak mogę przekazać referencję obiektu w wektorze za pomocą iteratora, tak jak robię to z *rock[i]?

+0

Warto wspomnieć, że zamiast surowych wskaźników należy użyć wektora inteligentnych wskaźników. Sprawiają, że twoje życie jest o wiele łatwiejsze. – chris

Odpowiedz

7

Nie widząc więcej kodu, nie jestem pewien, czy to jest problem, ale czy kod w bullet.hit() zmienia wektor, dodając elementy? Jeśli tak jest i robisz iterację za pomocą iterator, iterator zostanie unieważniony, a wszelkie przyszłe dereferencje na nim spowodują niezdefiniowane zachowanie. Jednak użycie pętli standardowej opartej na standardzie int nie będzie miało tego problemu, ponieważ dostęp do indeksu nie może zostać unieważniony.

Mam nadzieję, że to pomoże!

+1

Ah dziękuję! To był problem. Wiele warstw z funkcji nazwanych w 'hit()' zmieniło się w wektorze i zupełnie o tym zapomniałem! –