2013-05-19 22 views
1

我有一個diagonal類作爲原則對角線。爲了儘量減少空間我存儲{begin: point, size: int},而不是存儲point小號重載operator->迭代器,其中底層容器不存儲真實對象

列表現在,我的算法將很容易實現。如果我可以讓對角線迭代。所以我寫了一個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儲存在容器我無法通過我的迭代器返回引用或指針。所以在所有情況下,我都要創建一個點(可複製)對象並返回。

所以我的引用typedef實際上不是引用。這個可以嗎 ?

我無法實現operator->()返回point對象,它必須返回一些指針,point*或指針等。我不能只返回new point(operator*()),因爲用戶需要刪除它們。所以我正在使用shared_ptr。這個可以嗎 ?

我不能使用unique_ptr,因爲它的C++ 11。和scoped_ptr不可複製。

+0

爲什麼不在迭代器本身存儲一個點? –

回答

3

可以返回一個對象存儲point並提供operator->()過載:至operator->()的調用鏈,直到它最終到達其確實返回一個指向一個結果:

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*()); 
} 

雖然這種方法是有效的,在迭代器中存儲point對於性能原因和從對象生命週期的角度來看可能是優選的。

+0

您正在編寫一個可複製的'scoped_ptr'。類似於'unique_ptr'。我不應該爲此使用/寫一個通用'copyable_scoped_ptr'嗎? –

+0

請注意,「指向」對象實際上嵌入在'point_pointer'內。顯然,這種方法可以推廣,但我不認爲它是'copyable_scoped_ptr':該對象給一個對象賦予一種[部分]指針式的感覺。 –

+0

@NeelBasu不同的是,在這種情況下,沒有堆分配,沒有'new'或'delete'就像智能指針一樣,只是一個指向棧分配值對象的指針。 – Oktalist