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

时间:2019-01-03 14:40:44

标签: c++ function struct

我希望函数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;
}

我希望函数从给定的整数创建日期类型的数据。非常感谢。

4 个答案:

答案 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;

您需要overload operator<< for your Date struct

答案 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