Если класс содержит объект другого класса, можно ли его инициализировать, имея значение по умолчанию в конструкторе содержащего класса в С++?

Компиляция этого кода выдает ошибку

error time constructor time::time(int,int,char) cannot be overloaded with time::time(int,int,char)

Я пытаюсь уменьшить количество перегруженных конструкторов, поэтому я пытаюсь указать значения по умолчанию в параметрах конструктора. Допустима ли строка entry(int sno=5,time t{1,2,'p'}); в конструкторе для класса entry? Если класс содержит сложный объект другого класса, то можно ли его инициализировать таким образом?

#include<iostream>

using namespace std;


class time
{
    int hours;
    int mins;
    char ap;
    
public:
    time(int hours=0,int mins=0,char ap='n');
    time(int a, int b, char c): hours{a},mins{b},ap{c}
    {
    }
    
    void showtime()
    {
        cout<<"\nTime : "<<hours<<" "<<mins<<" "<<ap<<endl;
    }
};

class entry{
    int sno;
    time t;
    public:
        entry(int sno=5,time t{1,2,'p'});
        void showdata()
        {
            cout<<"\ne : "<<sno<<" : ";
            t.showtime();
        }
        
};


int main()
{
    entry e;
    e.showdata();
    return 0;
}

person Pratap Biswakarma    schedule 05.09.2020    source источник
comment
Вы явно знаете синтаксис значений аргументов по умолчанию (используя присваивание с =). Неважно, аргумент это int или объект, синтаксис тот же.   -  person Some programmer dude    schedule 05.09.2020
comment
Ваша ошибка связана с определением класса time, но вы спрашиваете о классе entry. Это подозрительно похоже на несколько вопросов или, возможно, на необоснованный поспешный вывод. Я бы предложил скомпилировать класс time, прежде чем спрашивать о классе entry.   -  person JaMiT    schedule 05.09.2020
comment
часть задания помогла, спасибо!   -  person Pratap Biswakarma    schedule 05.09.2020


Ответы (1)


Да, это возможно, это просто синтаксис:

#include<iostream>

using namespace std;

class Time
{
    int _hours;
    int _mins;
    char _ap;
    
public:
    Time(int hours=0,int mins=0,char ap='n'): _hours(hours),_mins(mins),_ap(ap)
    {};
    
    void showtime()
    {
        cout<<"\nTime : "<< _hours << " " << _mins << " " << _ap << endl;
    }
};

class entry{
    int _sno;
    Time _t;
    public:
        entry(int sno=5,Time t = Time(1,2,'p')):
        _t(t), _sno(sno)
        {};
        void showdata()
        {
            cout<<"\ne : "<< _sno<<" : ";
            _t.showtime();
        }
        
};


int main()
{
    entry e;
    e.showdata();
    Time t2(5,2,'a');
    entry e2(3, t2);
    e2.showdata();
    return 0;
}
person Goozzi    schedule 05.09.2020
comment
Это сработало!, можете ли вы объяснить, почему вы ставите точку с запятой после каждого конструктора, а также, когда вы пишете entry(int sno=5,Time t = Time(1,2,'p')), вы создаете временный объект времени и используете его для инициализации time t? - person Pratap Biswakarma; 05.09.2020
comment
Хорошо, точка с запятой - это ошибка, извините. Я не эксперт, но я думаю, что если аргумент не указан, объект Time создается и используется, как если бы этот объект был передан в качестве аргумента. Так что это не временный объект, - person Goozzi; 05.09.2020
comment
Точки с запятой после конструкторов необязательны, но обычно считаются плохим стилем из-за избыточности. - person M.M; 05.09.2020