课程问题,增加一天

时间:2009-07-14 17:23:35

标签: c++ date linker

我正在努力使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.S。不要担心在月底增加天数。这是将在稍后实施的内容。

6 个答案:

答案 0 :(得分:6)

链接器错误是因为您没有定义构造函数。

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

对于add_day问题:您是正确的,您需要更改返回类型。它应该返回一个Date对象。您可以构造一个新的Date对象并返回日值增加或只增加日值并返回* this。

答案 1 :(得分: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的副本。

答案 2 :(得分:2)

你已经声明了一个构造函数Date :: Date(int,int,int),并且调用了它,但它没有定义。 Ergo,链接器错误。

答案 3 :(得分: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对象,将其设置为适当的日期(除了白天之外都是相同的),然后返回它。

答案 4 :(得分:2)

未定义Date构造函数。您可以将其定义为:

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

答案 5 :(得分:0)

使用三个参数声明类Date的构造函数,但从不定义它。

您想要添加Date::Date(int yy, int mm, int dd) : y(yy), m(mm), d(dd) {}

之类的行

对于第二个问题 - add_day必须返回DateDate &