如何使用std :: vector实现存储咒语和物品?


10

我现在正在跟着GameInstitute的一本书,它要求我:

允许玩家购买和携带治疗药水和火球药水。您可以将Item数组(在定义item类之后)添加到Player类中以存储它们,或使用std :: vector来存储它们。

我想我想使用std::vector实现,因为这似乎使我比创建一个项目类更容易些,但我不确定该怎么做。我从很多人那里听说向量是存储动态值(例如物品,武器等)的好方法,但是我没有看到它的使用。


3
无论哪种方式,您都需要一个Item类。项目数组将是项目项目[INVENTORY_SIZE];项目的std :: vector将是std :: vector <Item>项目;std :: vector只是一个数组,其大小可以动态更改。
API野兽

1
要将对象存储在向量中,它们必须是相同类型的对象。做到这一点的方法是创建一个Item向量(其中Item是可以拾取的所有项目的接口)和每种项目类型(治疗药水和火球药水)的类。只要药水类实现Item接口,您就可以将它们存储在矢量中(尽管事情变得更加复杂,您可能希望为诸如消耗性物品,可堆叠物品或仅仅是药水之类的东西添加更多接口。但是为了简单起见,每个项目一个类,以及“项目”界面)
本杰明·丹格·约翰逊

Answers:


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();

vector该类的MSDN文档可能值得一读,如果您对模板不熟悉(这是vector用来允许它存储“任何内容”的方式),那么您也应该了解那里的基础知识。这也引出了我的最后一点:虽然看起来向量可以存储任何内容,但是它确实对其中所允许的内容有约束,并且这些约束有时会引发初学者。特别是,您存储在向量中的类型必须是可复制的,因为例如,向量在调整其内部存储器的大小时将需要复制对象。这里要记住C ++ 的三个规则


谢谢,这很简洁。我正在阅读文档-当我有15个代表时,我将确保返回并投票给您!
Vladimir Marenus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.