2017-04-07 87 views
0

我有实例的数组,在我的代码,像这样:如何计算实例数组中未删除的实例?

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

的可能性? 'std :: list'似乎是合适的。 – JHBonarius

+2

您无法检查指针的目标是否被删除。删除后直接将其设置为NULL即可。或者从列表中删除它。或使用智能指针。 – flyx

+1

您不能检查指针是否有效。不要使用原始指针。 –

回答

2
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一起工作。

注意:不要放弃你为什么不使用STL容器中使用

std::vector<SpaceMarine> units; 
+0

如果没有另一个函数返回过去最终迭代器,getUnits是不是没用? – Quentin

+0

@Quentin斑点。 –