Как правильно передать параметры из структуры в функцию? - PullRequest
0 голосов
/ 03 января 2019

Я бы хотел, чтобы функция dateCreate передавала данные параметры из структуры.

Я пытался использовать переменную Date d в качестве параметра функции, но он по-прежнему показывает мне, что «поле« день / месяц / год »не может быть разрешено».

struct Date{
int day;
int month;
int year;
} ;

Date dateCreate (int d, int m, int y){
 Date d;
 d.day =d;
 d.month = m;
 d.year =y;
return 0;
};


int main() {
 int d,m,y;
 cin << d << m << y;
 cout << dateCreate(d,m,y); //Not completely sure if this is right either.


return 0;
}

Я хочу, чтобы функция создавала тип данных Date из данных целых чисел.Большое спасибо.

Ответы [ 4 ]

0 голосов
/ 03 января 2019

Эквивалентный код:

struct Date
{
    int d;
    int m;
    int y;
};

int main()
{
    int d = 1, m = 1, y = 1980;
    std::cin >> d >> m >> y;
    Date date{d, m, y}; // default constructor is called here
}

При этом, поскольку проблема, которую вы решаете, заключается в чтении даты, вам, вероятно, следует реализовать ее следующим образом:

struct Date
{
    int d;
    int m;
    int y;
};

std::istream& operator >>(std::istream& in, Date& d)
{
    int d = 1, m = 1, y = 1980;

    if(in >> d >> m >> y) // only set values if they were read successfully
        d = Date{d, m, y};

    return in;
}

Код клиента:

int main()
{
    Date d{1, 1, 1980};
    in >> d;
}
0 голосов
/ 03 января 2019

Вместо бесплатной функции, я бы посоветовал вам дать вашему struct конструктору

struct Date{
    Date(int _day, int _month, int _year)
    : day(_day), month(_month), year(_year)
    { }

    int day;
    int month;
    int year;
};

Затем вы можете создать этот объект как

int d,m,y;
cin >> d >> m >> y;
Date date(d, m, y);

Чтобы сделать что-то вроде

cout << date;

вам нужно перегрузить operator<< для вашей Date struct

0 голосов
/ 03 января 2019

Самый краткий способ исправить ваш фрагмент кода - предоставить оператор вывода для Date объектов, например,

std::ostream& operator << (std::ostream& os, const Date& date)
{
   return os << date.day << "/" << date.month << "/" << date.year;
}

затем используя правильные операторы для чтения пользовательского ввода

cin >> d >> m >> y;

и, наконец, с помощью конструктора Date, сгенерированного компилятором:

cout << Date{d, m, y};

Вам не нужна функция, создающая объект даты, если вы не проверяете ввод.

Обратите внимание, однако, что Date объекты теперь могут находиться в недопустимых состояниях (отрицательные значения дня или месяца и т. Д.), Поэтому для дальнейшего уточнения вы должны либо реализовать правильный конструктор, который генерирует недопустимый ввод, либо изменить createDate функция такая, что это например возвращает std::optional<Date>, который является пустым (std::nullopt) при недопустимом вводе.

0 голосов
/ 03 января 2019

dateCreate должен вернуть d, а не 0.

Для выражения cout << dateCreate(d,m,y) для компиляции необходимо реализовать std::ostream& operator<<(std::ostream&, Date const&).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...