如何计算实例数组中未删除的实例

how to count not deleted instances in array of instances?

本文关键字:实例 数组 删除 何计算 计算      更新时间:2023-10-16

我的代码中有一个实例数组,如下所示:

class Squad : public ISquad
{
    public:
        Squad(void);
        Squad(Squad const & src);
        virtual ~Squad(void);
        int             getCount(void) const;
        int             push(ISpaceMarine*);
        ISpaceMarine*   getUnit(int) const;
        ISpaceMarine**              getUnits(void) const;
        int                         getCapacity(void) const;
        Squad &     operator=(Squad const & rhs);    
    private:
        ISpaceMarine    **_units; // HERE IS THE ARRAY OF INSTANCES
        int const       _squadCapacity;
};

在构造函数中像这样初始化

Squad::Squad(void) : _units(new ISpaceMarine*[64]), _squadCapacity(64)
{
    return;
}

首先,好办法是好办法吗?

如果是,我尝试计算数组中有效实例的数量(不是NULL,不是deleted(,但我不知道如何检查_units[20]是否被删除。

我该怎么做?

他是我目前的做法:

int                         Squad::getCount(void) const
{
    int     count = 0;
    while (this->_units[count] != NULL && count < this->_squadCapacity)
        count++;
    return count;
}
    ISpaceMarine    **_units; // HERE IS THE ARRAY OF INSTANCES
    int const       _squadCapacity;

- 首先,这是好方法吗?

不,这不是一个好方法,并且巧妙地说明了为什么 std 容器和智能指针是一个很大的改进。

使用智能指针,您可以自动表达和处理所有权。

我的印象是Squad管理SpaceMarines,在这种情况下,您应该使用std::unique_ptr。 然后,您的Squad将看起来像

class Squad : public ISquad
{
  public:
    size_t             getCount() const;
    void             push(ISpaceMarine&&);
    using SpaceMarineIterator = std::vector<std::unique_ptr<SpaceMarine>>::iterator;
    // A typedef/using for this iterator would be appropriate.
    SpaceMarineIterator getUnit(int) const;
    // And this
    SpaceMarineIterator begin() const;
    SpaceMarineIterator end() const;
    size_t                         getCapacity() const;
    // no need for copy assign either.
    //Squad &     operator=(Squad const & rhs);    
  private:
    std::vector<std::unique_ptr<ISpaceMarine>> units;
  // No need for capacity. 
};

现在,如果您需要不同的所有权模型,您可以查看 std::shared_ptrstd::weak_ptr .不过,您的模型应该努力使用std::unique_ptr

注意:不要放弃使用

std::vector<SpaceMarine> units;