我有一个diagonal
类作为主要对角线。为了最小化空间,我存储{begin: point, size: int}
而不是存储point
的列表
现在我的算法很容易实现如果我可以使对角线可迭代。所以我写了一个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->()
的调用将被链接,直到它最终获得返回指针的结果:< / p>
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
可能是出于性能原因和对象生命周期的观点而优选的。