2017-04-07 5 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コンテナとスマートポインタが大きな改善点である理由をきちんと示しています。

スマートポインタを使用すると、自動的に所有権を表現して処理します。

SquadSpaceMarinesを管理していると感じる場合は、std::unique_ptrを使用してください。あなたのSquadは、あなたが所有権のために別のモデルが必要な場合はstd::shared_ptrstd::weak_ptrに見ることができ、今

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::unique_ptrで作業するよう努力する必要があります。

注:STLコンテナを使用していないのはなぜ

std::vector<SpaceMarine> units; 
+0

'getUnits'はpast-the-endイテレータを返す別の関数なしで役に立たないのですか? – Quentin

+0

@Quentinよく見つかった。 –

関連する問題