【问题标题】:Overloading postfix operator doesn't work重载后缀运算符不起作用
【发布时间】:2014-05-16 01:31:15
【问题描述】:
#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。

【问题讨论】:

  • 你的操作员坏了。由于某种原因,它们返回一个默认构造的对象。
  • 好的,伙计们,我修好了...我将 (*this) 添加到 NumDays obj1;并将其设为 NumDays obj1(*this);现在就是这样。

标签: c++ operators overloading


【解决方案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 函数。这纯粹是为了方便解决问题。

新版本的后增量运算符如下所示:

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

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

我没有对您的 simplify() 例程进行任何更改。

然后我用这段代码对其进行了测试:

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

现在一切正常。

【讨论】:

    【解决方案2】:

    当您在 operator++() 中修改小时时,您将更改 this->hour 的值。完全独立于 *this 的 obj1 的内容没有改变。你想摆脱 obj1。

    我不确定你想在这里返回什么......如果你返回小时的“简化”值,那将是非常不直观的,因为我们期望 ++ 返回的值大于它开始时的值 1。这违反了最小惊讶原则。 :)

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

    【讨论】:

      猜你喜欢
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-18
      • 1970-01-01
      • 2020-01-14
      相关资源
      最近更新 更多