2009-07-14 5 views
0

add_day 기능을 작동 시키려고하는데 문제가 있습니다. struct을 변경할 수는 없다는 점에 유의하십시오 (매우 단순합니다). 연습의 요점은 주어진 것과 함께 프로그램을 작동시키는 것입니다. 코드는수업 문제, 하루 추가

#include "std_lib_facilities.h" 

struct Date{ 
     int y, m, d; 
     Date(int y, int m, int d); 
     void add_day(int n); 
}; 

void Date::add_day(int n) 
{ 
    d+=n; 
} 

ostream& operator<<(ostream& os, const Date& d) 
{ 
     if(d.m<1 || d.m>12 || d.d<1 || d.d>31) cout << "Invalid date: "; 
     return os << '(' << d.y 
        << ',' << d.m 
        << ',' << d.d << ')'; 
} 

int main() 
{ 
    Date today(1978,6,25); 
    today.add_day(1); 
    cout << today << endl; 
    keep_window_open(); 
} 

내가 undefined reference to Date::Date(int,int,int)을 말한다 링커 오류를 받고 있어요,하지만 난 뭐가 잘못 알아낼 수 없습니다. 그것은 마치 Date 생성자와 관련이있는 것처럼 보이지만 무엇이 확실하지 않습니다.

또한

Date tomorrow = today.add_day(1); 

처럼 내일 코드의 라인에 추가 할하지만 add_day는 공공 형이기 때문에 변환 문제가있을 것이라는 느낌을 가지고있다.

도움을 주시면 감사하겠습니다. - 감사합니다.

P. 월말에 일을 추가하는 것에 대해 걱정하지 마십시오. 나중에 구현 될 내용입니다.

답변

6

링커 오류는 생성자를 정의하지 않았기 때문에 발생합니다.

add_day 질문의 경우 반환 유형을 변경해야합니다. Date 객체를 반환해야합니다. 새로운 Date 객체를 생성하고 증가 된 날짜 값으로 반환하거나 일 값을 증가시키고 * this를 반환 할 수 있습니다.

2

생성자 Date :: Date (int, int, int)를 선언하고 호출했지만 정의가 없습니다. Ergo, 링커 오류입니다. 특히 당신이지고있는 오류에

2

: 당신은 기본이 아닌 생성자 (정의하는

1) 즉, 세 개의 매개 변수를 가져옵니다 하나). 이것은 컴파일러에 의해 자동으로 생성되지 않으므로 구현을 제공해야합니다. 그래서 링크 오류가 발생합니다.

나는 완전히 C++ 구문을 기억하지 않는다, 그러나이 같은 뭔가 :

Date::Date(int _y, int _m, int _d):y(_y),m(_m),d(_d){} 

2) add_day의 의미는 무엇입니까? add_day가 호출 된 날짜 객체를 가져 와서 변경하면 정확히 무엇을 반환하겠습니까? 무효 할 필요는 없지만 원하는대로 정의 할 수 있지만 가장 직관적 인 의미가 무엇인지 자세히 생각해보십시오.

createTomorrow()라는 함수를 원하지만 현재 Date 객체를 수정하지 않고 대신 새 Date 객체를 생성하고 적절한 날짜 (일을 제외하고 모두 동일하게 설정)로 설정 한 다음 반환합니다.

2

Date 생성자가 정의되지 않았습니다. 이 같은으로 정의 할 수 있습니다 :

Date::Date(int y, int m, int d) 
{ 
    this.y = y; 
    this.m = m; 
    this.d = d; 
} 
4

당신은 생성자가

Date(int y, int m, int d); 

를 선언하지만 생성자의 정의를 쓴 적이 없다.아마도 당신은
Date tomorrow = today.add_day(1); 

Date::add_day(int)

이 작동 할 새로운 하루를 반환해야합니다, 또한

Date::Date(int y, int m, int d):y(y),m(m),d(d) 
{ 
} 

같은 몇 가지 코드를 추가 할 것입니다.

Date Date::add_day(int n) 
{ 
    d+=n; 
    return *this; 
} 

수정 후 this 사본을 반환합니다.

+0

Date &은 일반적으로 우리가 대신 사본의 const를 참조, 동일한 기능을하지만, 더 많은 반환 반환해야 시간이 많이 소요되는 복사 작업에 특히 효율적입니다 (여기에 그다지 문제가되지 않습니다). – DeusAduro

0

세 개의 매개 변수를 사용하여 Date 클래스의 생성자를 선언하지만 절대 정의하지 마십시오.

당신은 Date::Date(int yy, int mm, int dd) : y(yy), m(mm), d(dd) {}

처럼 그리고 두 번째 질문에 대한 행을 추가 할 - add_day가 Date 또는