带有自定义对象的C++数组

Lit*_*cod 1 c++ arrays

搜索谷歌和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)

它需要是数组而不是向量,因为它具有固定的大小

Sho*_*hoe 6

当我动态分配一个数组时,它的所有位置都是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.