2014-04-03 2 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이됩니다.과부하 후치 연산자가 작동하지 않습니다.

+0

도움이 될 수 있습니다. http://stackoverflow.com/questions/4421706/operator-overloading?rq=1 –

+3

운영자가 고장났습니다. 어떤 이유로 든 기본 생성 객체를 반환합니다. –

+0

좋아, 얘들 아, 고쳤다 ... NumDays obj1에 (* this)를 추가했다. 그리고 그것을 NumDays obj1 (* this)로 만들었습니다. 이제 이와 같이 작동합니다. – user3347541

답변

0

연산자 ++()의 시간을 수정하면 this-> hour 값을 변경합니다. * this와 완전히 독립적 인 obj1의 내용은 변경되지 않습니다. obj1을 없애고 싶습니다.

당신이 여기서 무엇을 반환하고 싶은지 잘 모르겠습니다 ... 시간의 "단순화 된"값을 반환하면 ++가 처음 값보다 큰 값 1을 반환하기 때문에 매우 직관력이 떨어집니다. 그것은 최소한의 경악의 원칙에 위배됩니다. :)

그래서 새로운 함수를 만들고 연산자 ++를 재정의하지 않아야합니다. 또는 연산자 ++를 재정의 한 경우 내부에서 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을 개체를 수정하지 않아야하는 다양한 멤버 함수에 추가하는 것이 었습니다.

내가 한 세 번째 것은 friend 함수로 ostream 추출기를 추가하는 것이 었습니다. 이는 문제 해결을위한 편의를위한 것입니다. 유일한 차이점은 obj1의 창조는 이제 기본 컴파일러 생성 된 복사 생성자를 사용한다는 것입니다

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

:

여기처럼 후행 연산자의 새 버전이 어떻게 표시되는지를 보여줍니다. 이것은 후행 연산자에 대해 증가되지 않은 값의 복사본을 반환해야하기 때문에 중요합니다. (후위 감소 연산자는 비슷한 수정이 필요합니다.) simplify() 루틴을 변경하지 않았습니다.

나는 다음이 코드로 테스트 :

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

이제 모든 것이 작동합니다.

관련 문제