重载postfix运算符不起作用

时间:2014-04-03 23:29:55

标签: c++ operators overloading

#include <iostream>

using namespace std;

class NumDays
{
private:
    int hour;
    int day;
    void simplify();

public:
    NumDays()
    {
        day = 0;
        hour = 0;
    }

    void setData(int d, int h)
    {
        hour = h;
        day = d;
        simplify();
    }

    int getHour()
    {
        return hour;
    }

    int getDay()
    {
    return day;
    }

    NumDays operator++(int);
    NumDays operator--(int);

};

void NumDays::simplify()
{
    hour = 8*day + hour;
    day = hour / 8;
    hour = hour % 8;
}

NumDays NumDays::operator++(int)
{
    NumDays obj1;

    hour++;
    simplify();
    return obj1;
    }

NumDays NumDays::operator--(int)
{
    NumDays obj1;

    hour--;
    simplify();
    return obj1;
}

void setFirst(NumDays &);
void setSecond(NumDays &);

void addData(NumDays &, NumDays &, NumDays &);

int main()
{
    NumDays first, second, third;

    setFirst(first);
    setSecond(second);

    addData(first, second, third);
}

void setFirst(NumDays &obj1)
{
    int day, hour = 0;
    cout << "Please enter the amount of days followed by hours." << endl;
    cin >> day >> hour;
    obj1.setData(day, hour);
}

void setSecond(NumDays &obj2)
{
    int day, hour = 0;
    cout << "Please enter the amount of days followed by hours again." << endl;
    cin >> day >> hour;
    obj2.setData(day, hour);
}

void addData(NumDays &obj1, NumDays &obj2, NumDays &obj3)
{
    for (int k = 0; k < 8; k++)
    {
    obj3 = obj1++;
    cout << "  First Data: " << obj3.getDay() << " day(s), "
         << obj3.getHour() << " hour(s).";
    cout << "  First Data: " << obj1.getDay() << " day(s), "
         << obj1.getHour() << " hour(s).\n";
    }

    cout << endl;

    for (int l = 0; l < 8; l++)
    {
    obj3 = obj2++;
    cout << "   Second Data: " << obj3.getDay() << " day(s), "
         << obj3.getHour() << " hour(s).";
    cout << "   Second Data: " << obj2.getDay() << " day(s), "
         << obj2.getHour() << " hour(s).\n";
    }
}

当我运行文件时,obj3有0天0小时,obj2增加。怎么会这样? 当我尝试obj3 = obj2没有任何后缀标志时,它将其复制。因此我假设从obj2获取数据没有问题。但是当我包含后缀运算符时,数据变为0和0。

2 个答案:

答案 0 :(得分:1)

你几乎是对的。首先,我对你的班级做了一些改动。

class NumDays
{
private:
    int hour;
    int day;
    void simplify();

public:
    NumDays(int dy = 0, int hr = 0) : hour(hr), day(dy) { simplify(); }
    void setData(int d, int h)
    {
        hour = h;
        day = d;
        simplify();
    }
    int getHour() const { return hour; }
    int getDay() const { return day; }
    friend ostream& operator<<(ostream& out, const NumDays &nd) {
    return out << "  First Data: " << nd.getDay() << " day(s), "
         << nd.getHour() << " hour(s).";
    }
    NumDays operator++(int);
};

我做的第一件事就是重写构造函数以获得默认参数并使用现代风格。

我做的第二件事是将const添加到不会(并且不应该)修改对象的各个成员函数中。

我做的第三件事是添加ostream提取器作为friend函数。这纯粹是为了方便解决问题。

这里是postincrement运算符的新版本:

NumDays NumDays::operator++(int)
{
    NumDays obj1(*this);
    hour++;
    simplify();
    return obj1;
}

唯一的区别是obj1的创建现在使用默认的编译器生成的复制构造函数。这很重要,因为我们需要为postincrement运算符返回未增加值的副本。 (您的postfix减量运算符需要类似的修复。)

我对simplify()例程没有做任何更改。

然后我用这段代码测试了它:

int main()
{
    NumDays nd(2,3);
    cout << nd++ << endl;   // prints 2, 3
    cout << nd << endl;     // prints 2, 4
    return 0;
}

现在一切正常。

答案 1 :(得分:0)

当您在operator ++()中修改小时时,您将更改this-&gt;小时的值。 obj1的内容完全独立于* this不会改变。你想摆脱obj1。

我不确定你想要什么回到这里...如果你退回&#34;简化&#34;小时值将非常不直观,因为我们希望++返回比开始时更大的值1。这违反了最小惊讶原则。 :)

所以你真的应该创建一个新函数而不是覆盖operator ++。或者,如果你覆盖operator ++,那么就不要在其中调用simplify()。