0

我正在编写我的 Arrayhandler 类,我需要重载operator+operator++.

operator++超载是个好主意operator+(1)吗?我得到一个无限循环,因为据我所知_current = _pointee + i(size_t 在哪里i)没有改变_current。为什么?以这种方式添加指针是否正确?

class ArrayHandler
{
private:
     size_t _size;

     Pointee *_pointee; 
     Pointee *_end;
     mutable Pointee *_current; 
  ....
}

我的托儿:

template <typename Pointee>
    ArrayHandler<Pointee>::ArrayHandler(size_t size):
        _size(size), _pointee(new Pointee[_size]), _end(_pointee+_size), _current(_pointee)
        {};

运算符+:

ArrayHandler<Pointee>& ArrayHandler<Pointee>::operator+(size_t i)
    {
        if (!defined())
            throw MisUse(undefArray, 0);
        if ( _pointee + i > _end || _pointee + i < _pointee)
            throw MisUse(badIndex, i);
        _current = _pointee + i;
        return *this;
    };

运算符++:

template <typename Pointee>
ArrayHandler<Pointee>& ArrayHandler<Pointee>::operator++()
{
    if (!defined())
        throw MisUse(undefArray, 0);
    if ( stop() )
        throw MisUse(badIndex, 0);
    ++_current;*/
    this->operator+(1);
    return *this;
};

导致无限执行的while循环:

while (!ar3.stop())
    {
        ++ar3;
        ++count;
    }

stop()方法:

 bool stop() const {return _current ==_end;} 

更新:

无限while循环的原因是我通过operator+实现了operator++,在我的例子中,它确实改变了_current,每次start+1,所以在第二次迭代之后我的_current保持不变。每次都被start+1重复RESET。

伙计们!!

4

2 回答 2

3

您在运算符重载方面犯了一个错误:您operator+修改了它的参数!考虑:

int a = 1;
int b = 2;
int c = a + b;

您是否希望a在您致电时进行修改a + b?当然不是。

您要做的是operator+=正确实现,然后提供一个operator+和(如果需要)一个operator++(可能是前缀 ++i 和后缀 i++ 版本),它在内部使用您的operator+=. 以下是后者的一些草图,它们作为自由函数超出了您的类定义:

template <typename Pointee>
ArrayHandler<Pointee> operator+( ArrayHandler<Pointee> arg, size_t i )
{
    arg += i;
    return arg;
}

template <typename Pointee>
ArrayHandler<Pointee>& operator++( ArrayHandler<Pointee>& arg ) // prefix ++
{
    arg += 1;
    return arg;
}

template <typename Pointee>
ArrayHandler<Pointee> operator++( ArrayHandler<Pointee> arg, int ) // postfix ++
{
    arg += 1;
    return arg;
}

现在operator+=,您可以像这样实现它(作为成员函数):

ArrayHandler<Pointee>& ArrayHandler<Pointee>::operator+=(size_t i)
{
    if (!defined())
        throw MisUse(undefArray, 0);
    if ( _current + i >= _end || _current + i < _pointee)
        throw MisUse(badIndex, i); // this message is now probably misleading
    _current += i;
    return *this;
};

_current这是由元素推进的i,这是operator+=. 如果您只是想访问i-th 元素,您应该考虑编写operator[].

您也可以考虑为样板代码使用帮助程序库,例如 Boost.Operators,请参阅我的个人资料以获取一些链接。

于 2013-09-29T15:22:34.497 回答
2

在您的运算符 + 中,您不会增加电流,而是每次将其重置为 start+i;

_current = _pointee + i;

你可能的意思是这样做:

_current = _current + i;
于 2013-09-29T15:02:21.887 回答