设置等于nullptr的问题

时间:2018-07-08 15:30:49

标签: c++ pointers game-engine

我正在研究基于文本的RPG,以在整个夏天保持我的编程知识(到目前为止,我已经学习了两个学期的C ++)。

无论如何,我一直在研究角色的库存系统,但遇到了问题。库存是Item类型的数组(我已经做过)。 Item的默认构造函数将其设置为“普通摇滚”,但我只希望在创建清单时将其完全清空。所以我想到了一种解决方法。创建库存时,请将库存中每个位置的地址设置为等于nullptr

Inventory::Inventory()
{
    currentBPSize = 5;
    backpack = new Item[MAX_BACKPACK_SIZE];

    for(int i = 0; i < MAX_BACKPACK_SIZE; i++){
        &backpack[i] = nullptr;
    }
}

每当我运行此命令时,都会出现错误

  

需要左值作为赋值的左操作数

我在做什么错,还是我应该做些完全不同的事情?

1 个答案:

答案 0 :(得分:2)

执行&backpack[i]时,编译器会创建一个临时const值,该值表示backpack[i]的地址。这就是它随后尝试将nullptr分配给的值。由于编译器创建的临时值是const(backpack[i]的地址不变),因此编译器会在您尝试为其分配值时拒绝。

由于backpack是对象数组,因此您也不能将它们设置为null。

如果我在制作游戏,并且我假设您的设计是背包中有固定数量的插槽,则可以执行以下操作之一:

  • 创建“空闲插槽”项目类型,并将其作为默认构造项目。当用户更改背包的内容时,您将修改已经存在的Item。这将是对设计的最小修改,但从长远来看可能不是很好(添加内容时,复制构造函数必须是完美的)。
  • 或者将您的数组设置为Item*的数组(指向Item的指针),然后它们将可以为空。但是,这将需要更多的内存管理。
  • 更好的是,我可能将其设置为shared_ptr<Item>的数组,这样就不必担心内存管理。

正如其他评论者之一所说,我建议也使用std::vector而不是原始数组,除非这样做只是为了学习更多有关数组和内存管理的知识。