1

我有一个diagonal作为主对角线的类。为了最小化我存储的空间{begin: point, size: int}而不是存储points的列表

现在,如果我可以使对角线可迭代,我的算法将很容易实现。所以我写了一个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不可复制。

4

1 回答 1

3

您可以返回一个存储 apoint并提供重载的对象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但出于性能原因和从对象生命周期的角度来看,将 a 存储在迭代器中可能是更可取的。

于 2013-05-19T20:56:15.713 回答