Конструктор класса, использующий объект другого класса - PullRequest
0 голосов
/ 30 апреля 2020

В этом коде я хотел бы использовать объект класса 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;
};

Ответы [ 2 ]

3 голосов
/ 30 апреля 2020

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

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

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

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

1 голос
/ 30 апреля 2020

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

Date() = default;

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

private:
    unsigned int year{2000};
    unsigned int month{4};
    unsigned int day{30};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...