मैं std :: वेक्टर कार्यान्वयन का उपयोग करके वर्तनी और आइटम कैसे संग्रहीत कर सकता हूं?


10

मैं अभी GameInstitute की एक पुस्तक के साथ अनुसरण कर रहा हूं, और यह मुझसे पूछ रहा है:

खिलाड़ी को आग के गोले के उपचार और औषधि खरीदने और ले जाने की अनुमति दें। आप उन्हें संग्रहीत करने के लिए प्लेयर वर्ग में एक आइटम सरणी (आइटम वर्ग को परिभाषित करने के बाद) जोड़ सकते हैं, या उन्हें संग्रहीत करने के लिए एक std :: वेक्टर का उपयोग कर सकते हैं।

मुझे लगता है कि मैं std::vectorकार्यान्वयन का उपयोग करना चाहूंगा , क्योंकि यह मुझे आइटम वर्ग बनाने से कम भ्रमित करने वाला लगता है, लेकिन मैं अनिश्चित हूं कि ऐसा कैसे किया जाए। मैंने कई लोगों से सुना है कि वैक्टर गतिशील मूल्यों (जैसे कि आइटम, हथियार, आदि) को स्टोर करने के शानदार तरीके हैं, लेकिन मैंने इसका उपयोग नहीं देखा है।


3
आपको किसी भी तरह से एक आइटम वर्ग की आवश्यकता होगी। वस्तुओं का एक सरणी आइटम आइटम होगा [INVENTORY_SIZE]; एक std :: वस्तुओं का वेक्टर std होगा :: वेक्टर <आइटम> आइटम; एक std :: वेक्टर सिर्फ एक सरणी है जिसका आकार गतिशील रूप से बदला जा सकता है।
एपीआई-जानवर

1
एक वेक्टर में ऑब्जेक्ट्स को स्टोर करने के लिए उन्हें उसी प्रकार की ऑब्जेक्ट होना चाहिए। ऐसा करने का तरीका एक आइटम वेक्टर बनाना है (जहां आइटम को उन सभी मदों के लिए एक इंटरफ़ेस है, जिन्हें उठाया जा सकता है) और आपके प्रत्येक आइटम प्रकार (उपचार औषधि और आग का गोला औषधि) के लिए कक्षाएं। जब तक पोशन क्लासेस आइटम इंटरफ़ेस को लागू करते हैं, तब तक आप उन्हें वेक्टर में स्टोर कर सकते हैं (हालांकि जब चीजें अधिक जटिल हो जाती हैं, तो आप उपभोग्य वस्तुओं, स्टैकेबल आइटम, या बस खुद को औषधि जैसी चीजों के लिए अधिक इंटरफेस जोड़ना चाह सकते हैं। लेकिन सरलता के लिए। एक आइटम प्रति आइटम और आइटम इंटरफ़ेस)
बेंजामिन डेंजरस जॉनसन

जवाबों:


13

std::vectorवस्तुओं को "डायनामिक" (जैसा कि आप उन्हें कहते हैं) चीजों को स्टोर करने का एक अच्छा तरीका है, लेकिन वेक्टर का वास्तविक लाभ यह नहीं है कि आप जिस चीज को स्टोर कर रहे हैं वह बदल सकता है, लेकिन यह कि वेक्टर में वस्तुओं की संख्या न्यूनतम बिना बदल सकती है अपनी ओर से प्रयास। वर्णन करने के लिए, क्या आप अपनी Itemवस्तुओं को एक सरणी के रूप में संग्रहीत करने के लिए थे , आपको संकलन-समय ( Item items[SIZE];) पर सरणी के आकार को ठीक करना होगा , जिसका अर्थ है कि आपके पास वस्तुओं पर एक निश्चित ऊपरी सीमा है (अन्य मुद्दों के बीच, जो ' इस विशिष्ट विषय के लिए प्रासंगिक है और इसलिए मैं उन पर छोड़ दूंगा)।

आप गतिशील रूप से रन-टाइम पर सरणी आवंटित कर सकते हैं ( Item * items = new Item[SIZE];) जो आपको बाद में नए स्टोर आवंटित करने, आइटमों की प्रतिलिपि बनाने और पुराने संग्रहण को हटाने के द्वारा सरणी का आकार बदलने देगा। हालाँकि, यह आपके लिए बहुत अधिक काम है।

सौभाग्य से, std::vectorयह आपके लिए क्या करता है - यह एक गतिशील रूप से आकार का कार्यान्वयन है, अनिवार्य रूप से, और आपके लिए अपनी वर्तमान क्षमता से परे सरणी को बढ़ाने के लिए स्मृति प्रबंधन को संभालता है। यह निश्चित रूप से विकल्प है जो मैं आपको अभी के लिए आगे बढ़ाने का सुझाव दूंगा - लेकिन ध्यान दें कि आप अभी भी एक Itemवर्ग बनाना चाहते हैं ।

इसका उपयोग करना बहुत आसान है:

// Create an item list and two item objects to add to it.
std::vector<Item> items;
Item fireballPotion("Potion of Fireball");
Item healingPotion("Potion of Healing");

// Add the items:
items.push_back(fireballPotion);
items.push_back(healingPotion);

// operator[] is supported for accessing items.
// This will print "Potion of Fireball" for example:
std::cout << items[0].GetName();

vectorवर्ग के लिए MSDN प्रलेखन शायद एक पढ़ने के लायक है, और यदि आप टेम्पलेट से परिचित नहीं हैं - जो कि vector"कुछ भी" संग्रहीत करने की अनुमति देने के लिए उपयोग करता है - तो आपको मूल बातें भी ब्रश करना चाहिए। जो मुझे एक अंतिम बिंदु की ओर ले जाता है: जबकि ऐसा लगता है कि एक वेक्टर कुछ भी स्टोर कर सकता है, इसमें उस चीज के लिए अड़चनें हैं जो कभी-कभी होती हैं और ये कभी-कभी शुरुआती को फेंक देती हैं। विशेष रूप से, वेक्टर में आपके द्वारा संग्रहित किया जाने वाला प्रकार प्रतिलिपि योग्य होना चाहिए, क्योंकि वेक्टर को अपने आंतरिक भंडारण का आकार देते समय वस्तुओं की एक प्रतिलिपि बनाने की आवश्यकता होगी, उदाहरण के लिए। C ++ का तीन नियम यहां ध्यान रखने योग्य है।


धन्यवाद, यह स्पष्ट और संक्षिप्त था। मैं अब प्रलेखन पर पढ़ रहा हूं- जब मेरे पास 15 प्रतिनिधि होंगे, तो मैं वापस आकर आपको वोट देना सुनिश्चित करूंगा!
व्लादिमीर मारेनस 17
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.