带有自定义对象的C 数组

C++ array with custom objects

本文关键字:数组 对象 自定义      更新时间:2023-10-16

在搜索Google和Stackoverflow 2天后,我还没有找到任何东西

我已经与Java合作了大约一年,我决定在C 上创建一个练习

在Java中,这应该有效,但在C 中它震撼了我的想法。

我有这个代码

Item* inventory = new Item[24];

是持有项目的数组(库存)

当我动态分配数组时,所有柱子的帖子都是空的?如果没有,我可以使它们全部无效吗?

这就是在第一个空位置上添加项目的代码(拿起一个项目)

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;
            }
        }
    }
}

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

当我动态分配数组时,所有柱子的帖子都是空的?如果没有,我可以使它们全部无效吗?

像Java中的C 中没有这样的东西。您可以使用nullptr指针。在您的情况下,对象是默认的,因此不是null。

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

您通常不想动态分配,除非严格必要。如果您真的想要固定尺寸的数组,请使用std::array

我建议的是将std::arraystd::unique_ptr结合使用:

std::array<std::unique_ptr<Item>, 24> arr;

默认情况下,所有std::unique_ptr s均为nullptr。当您需要分配一个对象时,您将可以执行:

arr[i] = std::unique_ptr<Item>(new Item(...));

您甚至可以为智能指针创建一个别名:

using item_ptr = std::unique_ptr<Item>;

这将帮助您将代码重写为:

std::array<item_ptr, 24> arr;
arr[0] = item_ptr(new Item(...));

另外,您也可以使用boost::optional(或C 中的std::optional):

std::array<std::optional<Item>> arr;

您将能够检查特定的i元素是否为" null"(在Java sense)中:

if (arr[i])
    // not null

,您将能够分配一个值:

arr[i] = Item(...);

并用*arr[i]arr[i]->member_function(...);arr[i]->member_object

与您的最终评论相反,这似乎是std::vector的一个完全合理的应用。

现在,您正在尝试创建一个n个对象的数组,但是其中一些m实际上是null/empty/nonsement obsistent对象。

现实是,这完全是完全是固定尺寸的集合。这是一个可变尺寸的集合,可达到指定的最大值。在给定的时间,玩家可能携带1个或10个项目,但是他们可以携带的最大数量。但是,它们不是,但是,不断携带最大数量的项目,其中一些恰好是null项目 1

由于您要处理的是一个可变大小的集合(最多最大值),因此std::vector非常适合该帐单。由于您正在处理Item类,因此假设实际项目将是源自Item的具体类实例。在这种情况下,您确实需要在数组中存储(某些多种指针),而不是实际的项目对象(否则,您尝试放入数组中的每个派生的项目都会被"切成切片"才能成为实际项目对象,而不是派生对象,当它存储在数组中时)。

you can 通过创建unique_ptr S的集合(或其他各种其他智能指针类型,例如shared_ptr),但是我一般通常建议在这种情况您考虑了Boost ptr_vector类型。

就实施尺寸限制而言,您可能想创建一个小型包装类别来处理它。这并不是一项复杂的任务,但是最好将该代码集中到一个地方,而不是在任何地方复制大小检查代码,您可能会将项目添加到库存中。

template <class T>
class inventory { 
    ptr_vector<T *> items;
    size_t max;
public:
    inventory(size_t max) : max(max) {}
    push_back(T *t) { 
        if (items.size() < max)
            items.push_back(t);
    }
    // other miscellany here.
};

但是,您的不具有Item s的多态性层次结构。取而代之的是,您只有一个固定的类型,用于清单中的所有项目,每个项目都有一个名称等。如果是这种情况(即,所有Item s实际上都是相同类型的对象),则没有理由弄乱指针或ptr_vector。您真的只想要std::vector<Item>。但是,与上述非常相似,您无疑仍希望集中代码以强制库存的最大规模(并且可能还提供其他特定于库存的服务)。


  1. 如果您允许我进行题外话,那么有人会考虑这种可能性表明使用Java扭曲人们的思想的程度并破坏他们清楚思考的能力。为了解释Dijkstra,教爪哇应该是刑事犯罪。