Как правильно передать параметры из структуры в функцию?

Я бы хотел, чтобы функция 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 из данных целых чисел. Большое спасибо.

0
nl ja de

4 ответы

dateCreate should return d, not 0.

For expression cout << dateCreate(d,m,y) to compile you need to implement std::ostream& operator<<(std::ostream&, Date const&).

2
добавлено

Вместо бесплатной функции я бы предложил вам дать конструктору 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;

you'd need to overload operator<< for your Date struct

1
добавлено

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

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;
}
1
добавлено

Наиболее краткий способ исправить ваш фрагмент кода - предоставить оператор вывода для объектов 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};

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

Note, however, that Date objects can now be in invalid states (negative day or month values etc.), so for future refinement, you should either implement a proper constructor that throws upon illegal input, or change the createDate function such that it e.g. returns a std::optional which is empty (std::nullopt) upon illegal input.

0
добавлено
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest