2017-04-07 1 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이 아니라 이 아님). 예를 들어 _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는 지금

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'는 past-the-end 반복자를 반환하는 또 다른 함수없이 쓸모가 없습니까? – Quentin

+0

@Quentin 글쎄. –

관련 문제