【问题标题】:How to call postfix operator++?如何调用后缀运算符++?
【发布时间】:2016-06-28 06:14:46
【问题描述】:

假设我有以下代码:

struct ReverseIterator : public Iterator {
ReverseIterator& operator++() {Iterator::operator--();}
ReverseIterator& operator--() {Iterator::operator++();}

ReverseIterator operator++(int) { /* ... */ }
ReverseIterator operator--(int) { /* ... */ }
}

如何调用基类、迭代器、后缀递增/递减运算符?我知道为了区分修复前和修复后,正在传递一个临时虚拟变量。如果是这样的话,我不能直接调用Iteartor::operator++(1); sine 1 是一个整数吗?

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    你可以,但你不应该这样做。后缀 inc/dec 运算符通常必须通过调用相应的前缀形式来实现。而且基类操作符返回的值类型不兼容,作为派生类操作符返回会报错。

    struct ReverseIterator : public Iterator {
    ReverseIterator& operator++() {Iterator::operator--();}
    ReverseIterator& operator--() {Iterator::operator++();}
    
    ReverseIterator operator++(int) 
    {
        ReverseIterator result = *this;
        ++(*this);
        return result;
    }
    ReverseIterator operator--(int) 
    {
        ReverseIterator result = *this;
        --(*this);
        return result;
    }
    }
    

    我想你应该阅读这些问题: How to implement an STL-style iterator and avoid common pitfalls?

    How can I implement various iterator categories in an elegant and efficient way?

    【讨论】:

      【解决方案2】:

      是的,您可以以正常方式使用这些运算符,如++iterator(前缀)和iterator++(后缀),但您可以直接调用它们,传递任何参数。如果您实际上没有在定义中的任何地方使用形式参数,则可以传递任何内容,通常是0

      有时该参数用于增加某个值,如下所示:

      i.operator++( 25 ); // Increment by 25.
      

      但我不认为这是一种好的编程风格。这些运营商不应该这样做,这很令人困惑。

      Source.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-18
        • 2011-03-12
        • 1970-01-01
        • 2022-11-24
        • 2013-07-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多