C ++动态库存系统 - 添加/删除项目

时间:2014-10-23 17:10:58

标签: c++ arrays pointers dynamic inventory

好的,所以我在C ++中有一个文本驱动的游戏。我写了一个英雄课。我还写了一个名为Item的基类和一个名为Weapon的子类(这个想法是让Weapons,Potions,QuestItems等继承自Item类)。这样我就能成为我的" Hero"拥有Items的实例变量库存。我想这是动态的,以防Hero升级他/她的存储空间。

所以我的Hero类有一个成员/实例变量,它是一个指向Items的动态指针数组。我声明这个然后循环它将每个元素设置为一个新的项目,如下所示:

Item** inventory = new Item*[15];
for (int i = 0; i < 15; i++)
    inventory[i] = new Item();

这发生在Hero类的void Init()函数中,所有构造函数都调用它(灵活构造)。现在,我已经尝试编写一个成员函数来将项目添加到第一个&#34;空&#34;库存中的插槽,但这是非常坚韧不拔的,当我测试它时,无法弄清楚我的程序崩溃了什么。最终我发现当我试图访问数组的元素时它崩溃了。现在我只有这个片段假设第一个元素是空的并尝试&#34;添加&#34;数组中该索引的项目:

void Hero::AddToInventory(Item *item)
{
    *inventory[0] = item;
}

以下是我在main()中调用方法的方法:

int main()
{
    Hero *player = new Hero("Joe");
    Item *primaryWeapon = new Item("Dagger");
    player->AddToInventory(primaryWeapon);
    return 0;
}

非常感谢任何帮助;我在C ++中的动态对象和数据结构上有点生疏。提前谢谢!

P.S。 我知道这可以用矢量更简单,但我还没有学会如何使用它们,并且现在想坚持使用动态数组。

1 个答案:

答案 0 :(得分:1)

首先,您通过首先使用new Item()初始化每个数组索引,然后将该分配的项目替换为实际项目来泄漏内存。最好只有一个空指针数组开始。

Item** inventory = new Item*[15];
for (int i = 0; i < 15; i++)
    inventory[i] = NULL;

我相信你也可以将数组初始化为null,如下所示:

Item** inventory = new Item*[15] = {NULL,};

现在,你说你有一个名为Item的{​​{1}}子类,但我发现你从未使用它。一旦声明Weapon,它就是Item类型,不再能够变换为类似new Item()的派生类类型。因此,在这种情况下,要创建一把匕首武器,它应该更像是这样:

Weapon()

最后,您在Item *primaryWeapon = new Weapon("Dagger"); 期间遇到崩溃,因为您在给定索引处取消引用AddInventoryToItem的实例,然后将其分配给指向Item的指针,而不是{直接{1}}试试这个:

Item

另请注意,如果您只是使用新指针替换库存索引,则还可能导致内存泄漏。但是,如果每个项目都初始化为null而不是Item,并且您只将项目添加到空广告位,则这不会成为问题。