Std :: ভেক্টর বাস্তবায়ন ব্যবহার করে আমি কীভাবে বানান এবং আইটেমগুলি সঞ্চয় করতে পারি?


10

আমি এখনই গেমআইনস্টিটিউটের একটি বই সহ অনুসরণ করছি এবং এটি আমাকে জিজ্ঞাসা করছে:

প্লেয়ারকে ফায়ারবলের নিরাময়ের পশন এবং পশনগুলি কিনতে এবং বহন করার অনুমতি দিন। আপনি স্টোর করার জন্য প্লেয়ার ক্লাসে আইটেম অ্যারে (আপনি আইটেম ক্লাসটি সংজ্ঞায়িত করার পরে) যুক্ত করতে পারেন বা স্টোর করার জন্য একটি স্টাডি :: ভেক্টর ব্যবহার করতে পারেন।

আমি মনে করি আমি std::vectorবাস্তবায়নটি ব্যবহার করতে চাই , কারণ এটি একটি আইটেম শ্রেণি তৈরির চেয়ে কম আমাকে বিভ্রান্ত করছে বলে মনে হয় তবে কীভাবে এটি করা যায় তা সম্পর্কে আমি নিশ্চিত নই। আমি অনেক লোকের কাছ থেকে শুনেছি ভেক্টরগুলি গতিশীল মানগুলি সংরক্ষণ করার দুর্দান্ত উপায় (যেমন আইটেম, অস্ত্র ইত্যাদি), তবে আমি এটি ব্যবহার করে দেখিনি।


3
আপনার যে কোনও উপায়ে আইটেম ক্লাস লাগবে। আইটেমগুলির একটি অ্যারে আইটেম আইটেমগুলি হবে [INVENTORY_SIZE]; একটি স্টাড :: আইটেমগুলির ভেক্টর হবে স্ট্যান্ড :: ভেক্টর <আইটেম> আইটেমগুলি; একটি স্টাড :: ভেক্টর কেবল একটি অ্যারে যা আকার পরিবর্তনশীল হতে পারে।
এপিআই-বিস্ট

1
কোনও ভেক্টরে অবজেক্টগুলি সঞ্চয় করতে সেগুলি একই ধরণের অবজেক্ট হতে হবে। এটি করার উপায় হ'ল আইটেম ভেক্টর তৈরি করা (যেখানে আইটেমটি তোলা যায় এমন সমস্ত আইটেমের জন্য একটি ইন্টারফেস) এবং আপনার প্রতিটি আইটেমের ধরণের (নিরাময়ের দমন এবং ফায়ারবোল দাহ) classes যতক্ষণ না পশন ক্লাসগুলি আইটেম ইন্টারফেস প্রয়োগ করে আপনি সেগুলিকে ভেক্টরে সংরক্ষণ করতে পারেন (যদিও জিনিসগুলি আরও জটিল হয়ে উঠছে আপনি উপভোগযোগ্য আইটেম, স্ট্যাকযোগ্য আইটেমগুলি বা কেবল মাত্র পিউশনগুলির মতো জিনিসগুলির জন্য আরও ইন্টারফেস যুক্ত করতে চাইতে পারেন simp তবে সরলতার জন্য কেবল তৈরি করুন আইটেম প্রতি আইটেম এবং আইটেম ইন্টারফেস)
বেনিয়ামিন ডেঞ্জার জনসন

উত্তর:


13

std::vectorআইটেমের মতো জিনিস "ডায়নামিক" (যেমন আপনি তাদের ডাকছেন) সংরক্ষণ করার একটি দুর্দান্ত উপায়, তবে ভেক্টরটির আসল উপকারিতাটি এটি নয় যে আপনি সংরক্ষণ করছেন যে জিনিসটি পরিবর্তন করতে পারে তা নয়, তবে ভেক্টরের আইটেমের সংখ্যা ন্যূনতম পরিবর্তিত হতে পারে that আপনার পক্ষ থেকে প্রচেষ্টা। উদাহরণস্বরূপ, আপনি যদি 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ক্লাসের জন্য এমএসডিএন ডকুমেন্টেশন সম্ভবত পঠনযোগ্য, এবং যদি আপনি টেমপ্লেটগুলির সাথে পরিচিত না হন - যা vectorএটি "কিছু" সঞ্চয় করার অনুমতি দেয় - তবে আপনাকে সেখানে বেসিকগুলিও ব্রাশ করা উচিত। এটি আমাকে একটি চূড়ান্ত বিন্দুতেও নিয়ে যায়: যদিও মনে হয় কোনও ভেক্টর যে কোনও কিছু সংরক্ষণ করতে পারে, এতে এতে যা কিছু অনুমোদিত তা বাধা রয়েছে এবং এটি কখনও কখনও নবজাতককে ফেলে দেয়। বিশেষত, আপনি কোন ভেক্টরটিতে যে ধরণের স্টোরটি সংরক্ষণ করেন তা অবশ্যই অনুলিপিযোগ্য হতে হবে, কারণ ভ্যাক্টরের অভ্যন্তরীণ স্টোরেজটির আকার পরিবর্তন করার সময় বস্তুর অনুলিপি তৈরি করতে হবে। সি ++ এর তিনটি বিধি এখানে মনে রাখা দরকার।


আপনাকে ধন্যবাদ, এটি পরিষ্কার এবং সংক্ষিপ্ত ছিল। আমি এখন ডকুমেন্টেশনটি পড়ছি - যখন আমার 15 জন প্রতিনিধি থাকবে, আমি ফিরে এসে আপনাকে ভোট দেওয়ার বিষয়টি নিশ্চিত করব!
ভ্লাদিমির মেরেনাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.