В этом коде я хотел бы использовать объект класса birthday, конструкторы класса Date:

    Date(unsigned int y, unsigned int m, unsigned int d);
    Date(string yearMonthDay); // yearMonthDay must be in format "yyyy/mm/dd"

Но я получаю сообщение об ошибке: «Для класса Date не существует конструктора по умолчанию»

class Person {

public:
    Person(std::string name, char gender, Date birthday);
    string getName();
    char getGender();
    int getYear();
    int getMonth();
    int getDay();

private:
    Date birthday;
    std::string name;
    char gender;
};

Person::Person(std::string name, char gender, Date birthday){
    Person::name = name;
    Person::gender = gender;
    Person::birthday = birthday;
}

Дата урока:

class Date {
public:
    Date(unsigned int y, unsigned int m, unsigned int d);
    Date(string yearMonthDay); // yearMonthDay must be in format "yyyy/mm/dd"
    void setYear(unsigned int y);
    void setMonth(unsigned int m);
    void setDay(unsigned int d);
    void setDate(unsigned int y, unsigned int m, unsigned int d);
    unsigned int getYear() const;
    unsigned int getMonth() const;
    unsigned int getDay() const;
    string getDate() const; // returns the date in format "yyyy/mm/dd"

private:
    unsigned int year;
    unsigned int month;
    unsigned int day;
};
0
Luís Lucas 30 Апр 2020 в 18:07

2 ответа

Лучший ответ

Используйте список инициализатора конструктора :

Person::Person(std::string name, char gender, Date birthday){
    : name(name), gender(gender), birthday(birthday)
{
    // Empty
}

Это инициализирует членов только один раз, используя аргументы, вызывая соответствующие конструкторы членов.

Без списка инициализатора конструктора члены будут инициализированы по умолчанию (построены по умолчанию), а затем в теле конструктора вы будете использовать обычное назначение для членов.

3
Some programmer dude 30 Апр 2020 в 15:16

Когда вы пишете любой из ваших собственных конструкторов, конструктор без аргументов больше не предоставляется компилятором. Вы можете восстановить его (попросите его предоставить), хотя:

Date() = default;

Чтобы убедиться, что вы можете по умолчанию создать Date безопасно, вы должны дать соответствующие значения по умолчанию его членам:

private:
    unsigned int year{2000};
    unsigned int month{4};
    unsigned int day{30};
1
cigien 30 Апр 2020 в 15:48