どのように私は構造体から関数に正しくパラメータを渡すことができますか?

関数dateCreateが与えられたパラメータを構造体からのものに渡したいのです。

関数パラメータとしてDate d変数を使用してみましたが、それでもエラー "field" 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;
}

与えられた整数からDate型のデータを作成したい。どうもありがとうございました。

0
nl ru 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
追加された