我希望函数dateCreate将给定的参数传递给结构中的参数。
我尝试通过将Date d变量作为函数参数进行操作,但它仍然显示错误“字段“ day / month / year”无法解决”。
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;
}
我希望函数从给定的整数创建日期类型的数据。非常感谢。
答案 0 :(得分:2)
dateCreate
应该返回d
,而不是0
。
要使表达式cout << dateCreate(d,m,y)
进行编译,您需要实现std::ostream& operator<<(std::ostream&, Date const&)
。
答案 1 :(得分:1)
建议您为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;
答案 2 :(得分: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;
}
答案 3 :(得分:0)
修复代码段最简洁的方法是为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
。