#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。
答案 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()。