将事物设置为 nullptr 的问题
Issue with setting things equal to nullptr
我正在开发一个基于文本的角色扮演游戏,以在整个夏天保持我的编程知识(到目前为止,我已经学习了 2 个学期的 C++)。
无论如何,我一直在研究角色的物品栏系统,但 运行 遇到了一个问题。清单是 Item
类型的数组(我已经制作好了)。 Item
的默认构造函数将其设置为 "Plain Rock",但我只希望库存在创建时完全为空。所以我想到了一个解决方法。创建库存时,将库存中每个点的地址设置为等于 nullptr
:
Inventory::Inventory()
{
currentBPSize = 5;
backpack = new Item[MAX_BACKPACK_SIZE];
for(int i = 0; i < MAX_BACKPACK_SIZE; i++){
&backpack[i] = nullptr;
}
}
每当我运行这个,我得到一个错误
lvalue required as the left operand of the assignment
我哪里做错了,或者我应该做一些完全不同的事情?
当您执行 &backpack[i]
时,编译器会创建一个临时 const
值来表示 backpack[i]
的地址。这是它随后尝试分配 nullptr
的值。由于编译器创建的临时值是 const(backpack[i]
的地址没有改变),因此编译器会在您尝试分配给它时 barfs。
由于 backpack
是一个对象数组,您也不能将它们设置为 null。
如果我正在制作你的游戏并且我假设你的设计是你的背包有固定数量的插槽,我会执行以下操作之一:
- 创建一个 "Free Slot" 项目类型,并将其作为默认构造项目。当用户更改背包的内容时,您将修改已经存在的
Item
。这将是对您的设计的最小修改,但从长远来看可能不是很好 运行(您的复制构造函数在添加内容时必须是完美的)。
- 或者使您的数组成为
Item*
的数组(指向 Item
的指针),然后它们可以为空。然而,这将需要更多的内存管理。
- 更好的是,我可能会将其设为
shared_ptr<Item>
的数组,这样我就不必太担心内存管理了。
正如其他评论者之一所说,我建议也使用 std::vector
而不是原始数组,除非练习只是为了学习更多关于数组和内存管理的知识。
我正在开发一个基于文本的角色扮演游戏,以在整个夏天保持我的编程知识(到目前为止,我已经学习了 2 个学期的 C++)。
无论如何,我一直在研究角色的物品栏系统,但 运行 遇到了一个问题。清单是 Item
类型的数组(我已经制作好了)。 Item
的默认构造函数将其设置为 "Plain Rock",但我只希望库存在创建时完全为空。所以我想到了一个解决方法。创建库存时,将库存中每个点的地址设置为等于 nullptr
:
Inventory::Inventory()
{
currentBPSize = 5;
backpack = new Item[MAX_BACKPACK_SIZE];
for(int i = 0; i < MAX_BACKPACK_SIZE; i++){
&backpack[i] = nullptr;
}
}
每当我运行这个,我得到一个错误
lvalue required as the left operand of the assignment
我哪里做错了,或者我应该做一些完全不同的事情?
当您执行 &backpack[i]
时,编译器会创建一个临时 const
值来表示 backpack[i]
的地址。这是它随后尝试分配 nullptr
的值。由于编译器创建的临时值是 const(backpack[i]
的地址没有改变),因此编译器会在您尝试分配给它时 barfs。
由于 backpack
是一个对象数组,您也不能将它们设置为 null。
如果我正在制作你的游戏并且我假设你的设计是你的背包有固定数量的插槽,我会执行以下操作之一:
- 创建一个 "Free Slot" 项目类型,并将其作为默认构造项目。当用户更改背包的内容时,您将修改已经存在的
Item
。这将是对您的设计的最小修改,但从长远来看可能不是很好 运行(您的复制构造函数在添加内容时必须是完美的)。 - 或者使您的数组成为
Item*
的数组(指向Item
的指针),然后它们可以为空。然而,这将需要更多的内存管理。 - 更好的是,我可能会将其设为
shared_ptr<Item>
的数组,这样我就不必太担心内存管理了。
正如其他评论者之一所说,我建议也使用 std::vector
而不是原始数组,除非练习只是为了学习更多关于数组和内存管理的知识。