2013-05-19 1 views
1

저는 대각선 원칙 인 diagonal 클래스를 사용했습니다. 공간을 최소화하기 위해 point의 목록을 저장하는 대신 {begin: point, size: int}을 저장합니다.기본 컨테이너가 실제 객체를 저장하지 않는 반복자에 대한 연산자 오버플로 -

이제 알고리즘을 구현하기 쉽습니다. iterable을 대각선으로 만들 수 있습니다. 내 반복자를 통해 참조 또는 포인터를 반환 할 수없는 용기의 어디에도 저장 더 point 없다 그래서 나는 1 point_iterator

class point_iterator{ 
    friend class diagonal; 
    const diagonal& _diagonal; 
    size_t _position; 
    public: 
    typedef point_iterator self_type; 
    typedef point value_type; 
    typedef point reference;//< returning value instead of reference 
    typedef boost::shared_ptr<point> pointer;//< it can never return pointer 
    typedef std::random_access_iterator_tag iterator_category; 
    typedef boost::int32_t difference_type; 
    public: 
    pointer operator->(){return pointer(new point(_diagonal.at(_position)));} 
    point operator*(){return _diagonal.at(_position);} 

을 썼다. 그래서 모든 경우에 나는 point (copyable) 객체를 생성하고 리턴해야합니다.

그래서 내 참조 typedef는 실제로 참조가 아닙니다. 괜찮아?

point 개체를 반환하는 operator->()을 구현할 수 없으므로 어떤 포인터, point* 또는 포인터를 반환해야합니다. 사용자가 삭제해야하기 때문에 나는 단지 new point(operator*())을 반환 할 수 없습니다. 그래서 대신 shared_ptr을 사용하고 있습니다. 괜찮아?

해당 C++ 11 때문에 unique_ptr을 사용할 수 없습니다. scoped_ptr은 복사 할 수 없습니다. 이 방법이 작동 것이지만

class point_pointer 
{ 
private: 
    point m_p; 
public: 
    point_pointer(point p): m_p(p) {} 
    pointer const* operator->() { return &this->m_p; } 
}; 

point_pointer point_iterator::operator->() const { 
    return point_pointer(this->operator*()); 
} 

: 그것은 결국 포인터를 반환하지 결과에 도달 할 때까지 operator->()에 호출 체인됩니다

+0

왜 반복자 자체에 점을 저장하지 않습니까? –

답변

3

당신은 객체가 point를 저장하고 operator->()의 과부하를 제공하고 반환 할 수 있습니다 , 이터레이터에 point을 저장하는 것은 아마도 성능상의 이유와 객체의 수명 관점에서 더 바람직 할 것입니다.

+0

여러분은 복사가 가능한'scoped_ptr'을 짧게 쓰고 있습니다. 'unique_ptr'와 비슷합니다. 이것에 일반적인'copyable_scoped_ptr'을 쓰거나 써야하지 않습니까? –

+0

"pointed"객체는 실제로 point_pointer 안에 내장되어 있습니다. 분명히이 접근법은 일반화 될 수 있지만 나는 그것이 'copyable_scoped_ptr'이라고 생각하지 않는다 : 객체는 객체에 포인터와 같은 느낌을 준다. –

+0

@NeelBasu 차이점은이 경우 힙 할당이 없으며 스마트 포인터와 마찬가지로 'new'또는 'delete'도 없으며 스택에 할당 된 값 객체에 대한 포인터 일뿐입니다. – Oktalist

관련 문제