Hoe kan ik parameters van een struct naar een functie correct doorgeven?

Ik zou willen dat de functie dateCreate de gegeven parameters doorgeeft aan de parameters van de struct.

Ik heb geprobeerd door de variabele Datum d als een functieparameter te gebruiken, maar deze laat me nog steeds de fout "veld" dag/maand/jaar zien "kon niet worden opgelost".

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

Ik wil dat de functie een gegevenstype gegevens maakt van de gegeven gehele getallen. Dank u zeer.

0
ja ru de

4 antwoord

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
toegevoegd

In plaats van een gratis functie, zou ik aanraden om je struct een constructor te geven

struct Date{
    Date(int _day, int _month, int _year)
    : day(_day), month(_month), year(_year)
    { }

    int day;
    int month;
    int year;
};

Dan kun je dit object maken zoals

int d,m,y;
cin >> d >> m >> y;
Date date(d, m, y);

Om zoiets te doen

cout << date;

you'd need to overload operator<< for your Date struct

1
toegevoegd

Equivalente code:

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
}

Dit gezegd hebbende, omdat het probleem dat je oplost een datum is, zou je het waarschijnlijk op deze manier moeten implementeren:

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

Klantcode:

int main()
{
    Date d{1, 1, 1980};
    in >> d;
}
1
toegevoegd

De meest beknopte manier om uw fragment te herstellen, is het bieden van een uitvoeroperator voor Datum objecten, bijvoorbeeld

std::ostream& operator << (std::ostream& os, const Date& date)
{
   return os << date.day << "/" << date.month << "/" << date.year;
}

vervolgens gebruikt u de juiste operators om de gebruikersinvoer te lezen

cin >> d >> m >> y;

en ten slotte met behulp van de constructor Datum gegenereerd door de compiler:

cout << Date{d, m, y};

U hebt geen functie nodig om een ​​datumobject te maken zolang u de invoer niet verifieert.

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
toegevoegd