Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重载运算符->;对于迭代器,底层容器不使用';不存储真实对象_C++_Iterator_Operator Overloading - Fatal编程技术网

C++ 重载运算符->;对于迭代器,底层容器不使用';不存储真实对象

C++ 重载运算符->;对于迭代器,底层容器不使用';不存储真实对象,c++,iterator,operator-overloading,C++,Iterator,Operator Overloading,我有一个diagonal类,它充当对角线原则。为了最小化空间,我正在存储{begin:point,size:int},而不是存储点的列表 现在,如果我能使对角线可解,我的算法将很容易实现。所以我写了一个点迭代器 class point_iterator{ friend class diagonal; const diagonal& _diagonal; size_t _position; public: typedef point_iterator self

我有一个
diagonal
类,它充当对角线原则。为了最小化空间,我正在存储
{begin:point,size:int}
,而不是存储
点的列表

现在,如果我能使对角线可解,我的算法将很容易实现。所以我写了一个
点迭代器

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);}
类点迭代器{ 朋友类对角线; 常数对角线和u对角线; 尺寸(t)位置;; 公众: typedef point_迭代器self_type; 类型定义点值\u类型; typedef point reference;//<返回值而不是引用 typedef boost::shared_ptr pointer;//<它永远无法返回指针 typedef std::随机访问迭代器标记迭代器类别; typedef boost::int32_t difference_type; 公众: 指针运算符->(){返回指针(新点(_对角线位于(_位置));} 点运算符*(){返回(_位置);}
由于容器中的任何位置都没有
,因此我无法通过迭代器返回引用或指针。因此在所有情况下,我都必须创建一个点(可复制)对象并返回

所以我的引用typedef实际上不是引用,可以吗

我不能实现
操作符->()
,它返回
对象,它必须返回一些指针,
点*
或类似指针。我不能只返回
新点(操作符*())
,因为用户需要删除它们。所以我使用
共享的ptr
。这样可以吗


我无法使用
unique\u ptr
,因为它的C++11.和
作用域的\u 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*());
}

尽管这种方法可行,但出于性能考虑,从对象生命周期的角度来看,在迭代器中存储
可能更可取。

为什么不在迭代器本身中存储点呢?您编写的
范围内的ptr
是可复制的。类似于
唯一的ptr
。我不应该使用/writ吗是否为此创建一个通用的
copyable\u scoped\u ptr
?请注意,“指向”的对象实际上嵌入在
point\u指针中。显然,这种方法可以推广,但我不认为它是一个
copyable\u scoped\u ptr
:对象给出一个[partial]指针式指向对象的感觉。@NeelBasu区别在于,在这种情况下,没有堆分配,没有
new
delete
,就像智能指针一样,只有指向堆栈分配值对象的指针。