Вопрос класса, добавление дня - PullRequest
0 голосов
/ 14 июля 2009

Я пытаюсь заставить работать функцию 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 является пустым типом, возникнет проблема с конверсией.

Любая помощь будет принята - спасибо.

PS Не беспокойтесь о добавлениидни в конце месяца.Это то, что будет реализовано позже.

Ответы [ 6 ]

6 голосов
/ 14 июля 2009

Ошибка компоновщика из-за того, что вы не определяете конструктор.

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

Для вопроса add_day: вы правы, что вам нужно изменить тип возвращаемого значения. Он должен вернуть объект Date. Вы можете создать новый объект Date и вернуть его с увеличенным значением дня или просто увеличить значение дня и вернуть * this.

4 голосов
/ 14 июля 2009

У вас есть конструктор, объявленный

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 голосов
/ 14 июля 2009

Конструктор Date не определен. Вы можете определить это примерно так:

Date::Date(int y, int m, int d)
{
    this.y = y;
    this.m = m;
    this.d = d;
}
2 голосов
/ 14 июля 2009

В частности, к ошибкам, которые вы получаете:

1) Вы определяете конструктор не по умолчанию (то есть тот, который получает три параметра). Это не генерируется автоматически компилятором, поэтому вы должны предоставить реализацию. Вот почему вы получаете ошибку ссылки.

Я не полностью помню синтаксис C ++, но это что-то вроде этого:

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

2) Какова семантика add_day? Если add_day берет объект даты, на который он был вызван, и изменяет его, что именно вы хотите вернуть? Это не должно быть пустотой, вы можете определить все, что захотите, но задумайтесь над тем, что такое наиболее интуитивная семантика.

Возможно, вам нужна функция с именем createTestival (), которая не изменяет текущий объект Date, но вместо этого генерирует новый объект Date, устанавливает для него соответствующую дату (все то же самое, кроме дня) и затем возвращает ее.

2 голосов
/ 14 июля 2009

Вы объявили конструктор Date :: Date (int, int, int) и назвали его, но для него нет определения. Ergo, ошибка компоновщика.

0 голосов
/ 14 июля 2009

Вы объявляете конструктор класса Date с тремя параметрами, но никогда не определяете его.

Вы хотите добавить строку типа Date::Date(int yy, int mm, int dd) : y(yy), m(mm), d(dd) {}

И для второго вопроса - add_day должен был бы вернуть Date или Date &

...