Как я могу хранить заклинание и amp; элементов, использующих реализацию std :: vector?
Сейчас я следую за книгой из GameInstitute, и она просит меня:
Разрешить игроку покупать и носить лечебные зелья и зелья огненный шар. Вы можете добавить массив Item (после определения класса элемента) к классу Player для их хранения или использовать std :: vector для хранения их.
Я думаю, что я хотел бы использовать реализацию std::vector
, потому что это, похоже, путает меня меньше, чем создание класса предметов, но я я не знаю, как это сделать. Я слышал от многих людей, что векторы - отличные способы хранения динамических значений (например, предметов, оружия и т. Д.), Но я не видел, чтобы он использовался.
1 ответ
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();
Документация MSDN для vector
класс , вероятно, стоит прочитать, и если вы не знакомы с шаблонами - это то, что использует vector
, чтобы позволить ему хранить «что угодно» - вам следует освежить основы там, как Что ж. Это также приводит меня к конечной точке: в то время как похоже, что вектор может хранить что-либо, у него есть ограничения для того, что ему разрешено, и иногда они бросают новичков. В частности, тип, который вы храните в векторе, должен быть скопирован, потому что вектор, например, должен будет копировать объекты при изменении размера его внутреннего хранилища. C + + правило из трех - вот что нужно запомнить здесь.