2012-03-30 22 views
5

Tôi có một vector chứa con trỏ đến trừu tượng loại Rock:lặp thông qua một lỗi vector nguyên nhân nhưng đối với vòng chuẩn không

vector<Rock*> rocks; 

Nếu tôi lặp qua các vector với một iterator và sau đó cố gắng truy cập vào đối tượng (một lớp học không trừu tượng mà kéo dài Rock) thông qua iterator, tôi nhận được một lỗi 'EXC_BAD_ACCESS' trong XCode 4:

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

Nhưng Looping qua nó thường thích là không có vấn đề:

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

Chức năng hit() trông giống như:

bool Bullet::hit(Rock & rock) 

Tôi nghĩ rằng *(*rockIter)*rock[i] sẽ làm điều tương tự nhưng rõ ràng họ không. Điều gì là khác nhau, và làm thế nào tôi có thể vượt qua một tham chiếu của một đối tượng trong vector thông qua một iterator như tôi làm với *rock[i]?

+0

Điều đáng nói đến là bạn sẽ muốn sử dụng một vectơ con trỏ thông minh thay vì con trỏ thô. Họ làm cho cuộc sống của bạn dễ dàng hơn nhiều. – chris

Trả lời

7

Nếu không nhìn thấy mã khác, tôi không chắc liệu đây có phải là vấn đề không, nhưng mã có phải là bullet.hit() thay đổi véc tơ bằng cách thêm các phần tử không? Nếu đúng và bạn đang lặp lại nó bằng cách sử dụng một iterator, trình lặp đó sẽ bị vô hiệu và bất kỳ điều kiện tiên quyết nào trong tương lai trên đó sẽ dẫn đến hành vi không xác định. Tuy nhiên, bằng cách sử dụng tiêu chuẩn int dựa trên vòng lặp sẽ không có vấn đề này, bởi vì truy cập bằng chỉ mục không thể bị vô hiệu.

Hy vọng điều này sẽ hữu ích!

+1

Ah cảm ơn bạn! Đây là vấn đề. Nhiều lớp trong các hàm được gọi trong 'hit()' có một sự thay đổi trong vectơ và tôi hoàn toàn quên mất nó! –

Các vấn đề liên quan