如何将参数从结构正确传递到函数

How can I pass parameters from a struct to a function correctly?

本文关键字:函数 结构 参数      更新时间:2023-10-16

我希望函数 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 类型的数据。谢谢。

dateCreate应该返回d,而不是0

要编译表达式cout << dateCreate(d,m,y),您需要实现std::ostream& operator<<(std::ostream&, Date const&)

与其

说是一个自由函数,我建议你给你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;

您需要为Date结构重载operator<<

等效代码:

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;
}

修复代码段的最简洁方法是为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)。