2009-07-14 76 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是void類型會有一個轉換的問題。

任何幫助將不勝感激 - 謝謝。

P.S.不要擔心在本月底添加日期。這件事將在稍後實施。

回答

6

鏈接器錯誤是因爲您沒有定義構造函數。

Date::Date(int yr, int mo, int day) : y(year), m(month), d(day) 
{ 
} 

對於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::Date(int y, int m, int d):y(y),m(m),d(d) 
{ 
} 

此外,

Date tomorrow = today.add_day(1); 

Date::add_day(int)必須返回一個新的一天這個工作。

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

修改後將返回this的副本。

+0

一般來說,我們會返回一個const引用而不是複製,相同的功能,但更特別有效地複製費時(這裏沒有太多問題)。 – DeusAduro 2009-07-14 17:40:12

0

您用三個參數聲明Date類的構造函數,但從未定義它。

你想添加一行Date::Date(int yy, int mm, int dd) : y(yy), m(mm), d(dd) {}

而對於第二個問題 - add_day將不得不返回DateDate &