Як я можу зберігати заклинання та елементи за допомогою реалізації std :: vector?


10

Зараз я разом із книгою від GameInstitute, і вона просить мене:

Дозвольте гравцеві купувати та носити цілющі зілля та зілля з вогняної кулі. Ви можете додати масив елементів (після визначення класу елемента) до класу програвача для їх зберігання або використовувати std :: вектор для їх зберігання.

Думаю, я хотів би скористатися std::vectorреалізацією, тому що це, здається, бентежить мене менше, ніж створення класу елементів, але я не знаю, як це зробити. Я чув від багатьох людей, що вектори - це чудові способи зберігання динамічних значень (таких як предмети, зброя тощо), але я не бачив, щоб це використовувалося.


3
Вам потрібен клас "Елемент" у будь-якому випадку. Масив елементів буде Пункт елементів [INVENTORY_SIZE]; Std :: вектор елементів буде std :: вектор <Item> елементів; Std :: vector - це лише масив, розмір якого можна динамічно змінювати.
API-Beast

1
Для зберігання об'єктів у векторі вони повинні бути об'єктами одного типу. Для цього можна створити векторний предмет (де Item - інтерфейс для всіх предметів, які можна підібрати) та класи для кожного з ваших предметів (цілюще зілля та зілля з кулі). Поки класи зілля реалізують інтерфейс Item, ви можете зберігати їх у векторі (хоча, оскільки речі ускладнюються, ви, можливо, захочете додати більше інтерфейсів для таких речей, як витратні елементи, елементи, що складаються, або просто зілля. Але для простоти просто зробіть один клас на предмет та інтерфейс предмета)
Бенджамін Дангер Джонсон,

Відповіді:


13

std::vectorце прекрасний спосіб зберігання "динамічних" (як ви їх називаєте) речей, таких як предмети, але реальна користь вектора полягає не в тому, що річ, яку ви зберігаєте, може змінюватися, а в тому, що кількість елементів у векторі може змінюватися без мінімальних зусилля з вашого боку. Для ілюстрації, якщо ви мали би зберігати свої Itemоб’єкти як масив, вам доведеться виправити розмір масиву під час компіляції ( Item items[SIZE];), що означає, що у вас є фіксована верхня межа для елементів (серед інших питань, які не є ' t як стосується цієї конкретної тематики, тому я їх пропускаю).

Ви також можете динамічно розподілити масив під час виконання ( 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();

Документацію MSDN для vectorкласу , напевно, варто прочитати, і якщо ви не знайомі з шаблонами - саме це vectorвикористовує для того, щоб він міг зберігати "що завгодно" - вам слід також ознайомитися з основами. Що також призводить мене до остаточного моменту: хоча він, схоже, вектор може зберігати що завгодно, у нього є обмеження для того, що в ньому дозволено, а це іноді кидає початківців. Зокрема, тип, який ви зберігаєте у векторі, повинен бути копіюваним, оскільки вектору потрібно буде зробити копію об'єктів, наприклад, змінивши його внутрішнє сховище. Правило C ++ з трьох має тут пам’ятати.


Дякую, це було чітко і стисло. Я читаю документацію зараз. Коли у мене буде 15 представників, я обов'язково повернусь і проголосую за вас!
Володимир Маренус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.