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

C++ Dynamic Inventory System--Adding/Removing Items

本文关键字:添加 删除项目 系统 动态 C++      更新时间:2023-10-16

好的,所以我有一个C++中的文本驱动游戏。我写了一个英雄课。我还写了一个基类,名为Item,还有一个子类,名为Weapon(想法是让Weapons、Potions、QuestItems等继承自Item类)。这样,我就可以让我的"英雄"拥有一个实例变量的物品清单。我希望这是动态的,以防英雄获得存储空间的升级。

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

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

这发生在Hero类的void Init()函数中,所有构造函数都调用该函数(灵活构造)。现在,我试着写一个成员函数,将一个项目添加到清单中的第一个"空"插槽中,但这很难理解,当我测试程序时,我无法弄清楚是什么导致了程序崩溃。最终,当我试图访问数组的一个元素时,我发现它崩溃了。现在我只得到了这个片段,它假设第一个元素是空的,并试图在数组中"添加"给定给该索引的项:

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。我知道用矢量可以更简单地完成这项工作,但我还没有学会如何使用它们,现在我想坚持使用动态数组。

首先,首先用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的子类Weapon,但我发现你从来没有使用过它。一旦你声明了new Item(),它就属于Item类型,不再能够变形为像Weapon()这样的派生类类型。因此,在这种情况下,要制造匕首武器,它应该看起来更像这样:

Item *primaryWeapon = new Weapon("Dagger");

最后,在AddInventoryToItem期间发生崩溃,因为您在给定索引处取消引用Item的实例,然后将其分配给指向Item的指针,而不是直接指向Item。试试这个:

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

还要注意,如果您只是简单地用新指针替换库存索引,也可能导致内存泄漏。但是,如果每个项都被初始化为null而不是new Item(),并且您只将该项添加到一个空插槽中,那么这就不会有问题。