2009-07-14 126 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 &