在重载I / O运算符内重载增量运算符时出错

时间:2015-12-11 11:36:33

标签: c++ class operator-overloading post-increment friend-function

我是OOPS概念的初学者。我现在正在处理运算符重载。当我在no match for operator<<中使用重载的增量运算符时,我遇到错误cout。当我从cout中删除重载的增量时,它工作正常。从逻辑上讲,我觉得代码没有任何问题。不过,我不知道为什么会收到错误?以下是我的代码,以便更好地理解该问题。

#include <iostream>

using namespace std;
class Digit
{
private:
    int digit;

public:
    Digit(int n)
    {
        digit = n;
    }

    Digit& operator++();
    Digit operator++(int); //overloaded postfix increment. Dummy argument used
    Digit& operator--();
    Digit operator--(int); //overloaded postfix decrement. Dummy argument used

    friend ostream& operator<<(ostream& out, Digit& x); //overloaded << prototype

    int GetDigit()
    {
        return digit;
    }
};

Digit Digit::operator++(int)
{
    //Create a temporary object with a variable
    Digit temp(digit);

    //Use prefix operator to increment this Digit
    ++(*this);

    return temp; //return temporary result
}

Digit& Digit::operator++()
{
    if (digit==9)
        digit = 0;
    else
        ++digit;

    return *this;
}

Digit Digit::operator--(int)
{
    //Create a temporary object with a variable
    Digit temp(digit);

    //Use prefix operator to increment this Digit
    --(*this);

    return temp; //return temporary result
}

Digit& Digit::operator--()
{
    if (digit==0)
        digit = 9;
    else
        --digit;

    return *this;
}

int main()
{
    using namespace std;

    Digit n(9);
    Digit x(0);


    cout << n++ << endl;
    cout << x-- << endl;

    return 0;
}

ostream& operator<<(ostream& out, Digit& x)
{
    out << x.digit;

    return out;
}

cout << n++ << endl; cout << x-- << endl;内的行main()会导致错误。

1 个答案:

答案 0 :(得分:1)

这是因为后缀运算符按值返回 ,如果你不保存该值,你将有一个临时的,非const引用可以&#t; t绑定到临时工。

简单的解决方法是让输出操作符通过Digit引用获取const参数:

ostream& operator<<(ostream& out, Digit const& x)
//                                      ^^^^^