搜索谷歌和stackoverflow 2天后,我还没有找到任何东西
我正在使用Java大约一年了,我决定用C++创建一个游戏练习
在java中,这应该可以工作,但在C++中它会让我大吃一惊.
我有这个代码
Item* inventory = new Item[24];
Run Code Online (Sandbox Code Playgroud)
它是保存Items的数组(库存)
当我动态分配一个数组时,它的所有位置都是null?如果没有,我可以将它们全部归零吗?
这就是在第一个空位置添加项目的代码(拿起一个项目)
void Inventory::addItem(Item it){
if(isFull()){
cout << "Full inventory" << endl;
}else{
for(int i = 0; i<length; i++){
if(inventory[i] == nullptr){ // need this to work somehow
inventory[i] = it;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
它需要是数组而不是向量,因为它具有固定的大小
当我动态分配一个数组时,它的所有位置都是null?如果没有,我可以将它们全部归零吗?
在C++中没有像null那样的东西,就像在Java中一样.你可以使用nullptr指针.在您的情况下,对象是默认构造的,因此不为null.
它需要是数组而不是向量,因为它具有固定的大小
除非绝对必要,否则通常不希望动态分配.使用的std::array,如果你真的想要一个固定大小的数组.
我建议的是std::array结合使用std::unique_ptr:
std::array<std::unique_ptr<Item>, 24> arr;
Run Code Online (Sandbox Code Playgroud)
默认情况下,所有std::unique_ptrs都将是nullptr.当您需要分配一个对象时,您将能够:
arr[i] = std::unique_ptr<Item>(new Item(...));
Run Code Online (Sandbox Code Playgroud)
您甚至可以为智能指针创建别名:
using item_ptr = std::unique_ptr<Item>;
Run Code Online (Sandbox Code Playgroud)
这将帮助您重写代码:
std::array<item_ptr, 24> arr;
arr[0] = item_ptr(new Item(...));
Run Code Online (Sandbox Code Playgroud)
或者你也可以使用boost::optional(或std::optional从C++ 14):
std::array<std::optional<Item>> arr;
Run Code Online (Sandbox Code Playgroud)
您将能够检查特定i元素是否为"null"(在Java意义上):
if (arr[i])
// not null
Run Code Online (Sandbox Code Playgroud)
并且你将能够分配一个值:
arr[i] = Item(...);
Run Code Online (Sandbox Code Playgroud)
并使用*arr[i],arr[i]->member_function(...);或检索它arr[i]->member_object.