Я следую вместе с книгой из GameInstitute прямо сейчас, и она просит меня:
Разрешить игроку покупать и носить лечебные зелья и зелья огненного шара. Вы можете добавить массив Item (после определения класса элемента) в класс Player для их хранения или использовать std :: vector для их хранения.
Я думаю, что я хотел бы использовать std::vector
реализацию, потому что это, кажется, смущает меня меньше, чем создание класса элемента, но я не уверен, как это сделать. Я слышал от многих людей, что векторы являются отличным способом хранения динамических значений (таких как предметы, оружие и т. Д.), Но я не видел, чтобы они использовались.
c++
text-based
Владимир Маренус
источник
источник
Ответы:
std::vector
это прекрасный способ хранить «динамические» (как вы их называете) вещи, такие как предметы, но реальное преимущество вектора заключается не в том, что вещи, которые вы храните, могут измениться, а в том, что количество элементов в векторе может меняться без минимальных усилия с вашей стороны. Чтобы проиллюстрировать, если бы вы хранили своиItem
объекты в виде массива, вы должны были бы зафиксировать размер массива во время компиляции (Item items[SIZE];
), что означает, что у вас есть фиксированный верхний предел для элементов (среди других проблем, которые не ' Это относится к этой конкретной теме, поэтому я пропущу их).Вы также можете динамически размещать массив во время выполнения (
Item * items = new Item[SIZE];
), что позволит вам позже изменить размер массива, выделив новое хранилище, скопировав элементы и удалив старое хранилище. Это, однако, гораздо больше работы для вас.К счастью, это то, что
std::vector
вам нужно - это, по сути, реализация массива динамического размера, которая управляет памятью для увеличения массива за пределы его текущей емкости. Это определенно вариант, который я бы посоветовал вам продолжить, но учтите, что вы все равно захотите создатьItem
класс.Это очень легко использовать:
Документацию по MSDN для
vector
класса , вероятно, стоит прочитать, и если вы не знакомы с шаблонами, которыеvector
используются для хранения «чего-либо», вам также следует освежить в них основы. Что также подводит меня к последнему пункту: хотя вектор выглядит так, как будто он может хранить что угодно, у него есть ограничения на то, что в нем разрешено, и это иногда бросает новичков. В частности, тип, который вы храните в векторе, должен быть копируемым, потому что вектору необходимо будет, например, сделать копию объектов при изменении размера его внутреннего хранилища. Правило трех в C ++ - это то, что нужно иметь в виду.источник