【问题标题】:How can I pass parameters from a struct to a function correctly?如何正确地将参数从结构传递到函数?
【发布时间】:2019-01-03 14:40:44
【问题描述】:

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

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

【问题讨论】:

    标签: c++ function struct


    【解决方案1】:

    dateCreate 应该返回 d,而不是 0

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

    【讨论】:

      【解决方案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;
      

      你需要overload operator&lt;&lt; for your Date struct

      【讨论】:

        【解决方案3】:

        等效代码:

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

        【讨论】:

          【解决方案4】:

          修复 sn-p 最简洁的方法是为 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 对象现在可能处于无效状态(负日期或月份值等),因此为了将来的改进,您应该实现一个适当的构造函数,该构造函数会抛出非法输入,或者更改 @ 987654327@ 函数,例如在非法输入时返回一个空的std::optional&lt;Date&gt; (std::nullopt)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-03-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-01-08
            • 2019-11-05
            • 2020-05-04
            • 2012-08-18
            相关资源
            最近更新 更多