2014-04-03 50 views
0
#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重载postfix操作符不起作用

+0

这可能帮助:http://stackoverflow.com/questions/4421706/operator-overloading?rq=1 –

+3

你的运营商都断了。出于某种原因,它们返回一个默认构造的对象。 –

+0

好吧,我修好了...... 我把(* this)添加到NumDays obj1; 并使其NumDays obj1(* this); 它现在就是这样工作的。 – user3347541

回答

0

++()你是改变的这 - 值>小时。完全独立于*的obj1的内容没有改变。你想摆脱obj1。

我不知道你想回到这里......如果返回小时的“简化”的价值,因为我们预计++返回比它始于一个价值1时这将是非常直观的。这违反了最小惊讶原则。 :)

那么你真的应该创建一个新的功能,而不是覆盖运营++。或者,如果你重写operator ++,那么不要在里面调用simplify()。

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创建现在使用默认的编译器生成的拷贝构造函数。这很重要,因为我们需要为postincrement运算符返回未增量值的副本。 (你的后缀减量运营商需要一个类似的修复。)

我不需要做任何改变你的日常simplify()

我然后用这个代码,测试它:

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

现在一切正常。