2017-04-07 122 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斑點。 –