2012-03-30 16 views
5
नहीं

करता है मैं एक vector कि सार प्रकार Rock की ओर इशारा रखती है:पुनरावृत्ति एक वेक्टर कारण त्रुटि के माध्यम से, लेकिन मानक के लिए लूप

vector<Rock*> rocks; 

पुनरावर्तक के साथ वेक्टर के माध्यम से और फिर मैं पाश का उपयोग करने का प्रयास करें वस्तु (एक गैर सार वर्ग कि Rock फैली) iterator के माध्यम से, मैं XCode 4 में एक 'EXC_BAD_ACCESS' त्रुटि मिलती है:

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

लेकिन यह सामान्य रूप से की तरह के माध्यम से पाशन कोई समस्या नहीं है:

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

समारोह hit() लगता है:

bool Bullet::hit(Rock & rock) 

मैंने सोचा था कि *(*rockIter) और *rock[i] एक ही बात करना होगा लेकिन स्पष्ट रूप से वे नहीं है। अलग क्या है, और मैं *rock[i] के साथ एक इटरेटर के माध्यम से वेक्टर में ऑब्जेक्ट का संदर्भ कैसे पारित कर सकता हूं?

+0

यह उल्लेखनीय है कि आप कच्चे पॉइंटर्स के बजाय स्मार्ट पॉइंटर्स के वेक्टर का उपयोग करना चाहेंगे। वे आपके जीवन को इतना आसान बनाते हैं। – chris

उत्तर

7

अधिक कोड देखे बिना मुझे यकीन नहीं है कि यह समस्या है, लेकिन क्या bullet.hit() में कोड जोड़कर वेक्टर बदल रहा है? यदि यह है और आप iterator का उपयोग कर इसे फिर से चालू कर रहे हैं, तो इटेटरेटर को अमान्य कर दिया जाएगा और इसके बारे में भविष्य के किसी भी अव्यवस्था के परिणामस्वरूप अपरिभाषित व्यवहार होगा। हालांकि, मानक int-लूप के लिए आधारित इस समस्या में कोई समस्या नहीं होगी, क्योंकि अनुक्रमणिका द्वारा एक्सेस को अमान्य नहीं किया जा सकता है।

आशा है कि इससे मदद मिलती है!

+1

आह धन्यवाद! यह मुद्दा था। 'हिट()' में बुलाए गए कार्यों से कई परतें वेक्टर में एक बदलाव थीं और मैं पूरी तरह से इसके बारे में भूल गया! –

संबंधित मुद्दे