Вызов конструктора другого класса в конструкторе? [Дубликат]

0

Внутри отдельных файлов .h:

    class Appt{
        public:
        Appt(string location, string individual, DaTime whenwhere);

        private:
        string individual;
        string location;
        DaTime whenwhere;  // I thought this would initialize it 
        DaTime a;
    }

    class DaTime{
        public:
        DaTime(Day day, Time start, Time end); // Day is enum, Time is class

        private:
        int duration;
        Day day;
        Time start;
        Time end; 

    }

Внутри отдельных файлов .cc:

    // class Appt constructor
    Appt::Appt(string location, string individual, DaTime whenwhere)
    {
            a_SetLocation(location);
            a_SetIndividual(individual);
            DaTime a(whenwhere); // THE LINE IN QUESTION
    }

    // class DaTime constructor
    DaTime::DaTime(Day day, Time start, Time end)
    {

            dt_SetDay(day);
            dt_SetStart(start);
            dt_SetEnd(end);
    }

внутри main():

    /* Creating random variables for use in our classes */
    string loc1 = "B";
    string p1 = "A";

    /* Creating instances of our classes */
    Time t1(8, 5), t2(8, 30);
    DaTime dt1('m', t1, t2);
    Appt A1(loc1, p1, dt1);

Мой вопрос в том, есть ли чистый способ для меня вызвать конструктор DaTime внутри Appt? Я знаю, что этот способ не сработает, потому что мой экземпляр DaTime, a умрет после завершения constructor.

EDIT: Ошибка, которую я получаю:

    In constructor ‘Appt::Appt(std::string, std::string, DaTime):
    appt.cc: error: no matching function for call to ‘DaTime::DaTime()
     Appt::Appt(string location, string individual, DaTime when where)
    In file included from appt.h:15:0,
             from appt.cc:15:
    class.h:note: DaTime::DaTime(Day, Time, Time)
      DaTime(Day day, Time start, Time end);
      ^
    note:   candidate expects 3 arguments, 0 provided
    note: DaTime::DaTime(const DaTime&)
Теги:
class
constructor

2 ответа

2
Лучший ответ

Создайте a данных Appt и инициализируйте его в списке инициализации конструктора:

Appt::Appt(string location, string individual, DaTime whenwhere) : a (whenwhere)
{
  ....
}

Кроме того, неясно, хотите ли вы передать все свои параметры по значению. Вместо этого рассмотрим переходы const.

Примечание. Ошибка, которую вы получаете, показывает, что у вас есть DaTime данных DaTime в вашем классе и что вы не инициализируете его в списке инициализации конструктора. Это означает, что инициализация по умолчанию должна выполняться, и поскольку DaTime не имеет конструктора по умолчанию, вы получаете ошибку. Помните: как только вы находитесь в теле конструктора, все ваши члены данных были инициализированы. Если вы не инициализируете их явно, они создаются по умолчанию.

DaTime whenwhere;  // I thought this would initialize it 

Это не инициализация. Это просто объявление участника. whenwhere будет whenwhere инициализация при DaTime конструктора DaTime. В С++ 11 вы также можете инициализировать в точке объявления:

DaTime whenwhere{arg1, arg2, aer3};
  • 0
    Но тогда я должен был бы вернуться ? a
  • 0
    @AllenS Эмм, нет.
Показать ещё 5 комментариев
0

В классе Appt содержится следующий код:

DaTime a;

и в конструкторе Appt

Appt::Appt(string location, string individual, DaTime whenwhere)
    {
            a_SetLocation(location);
            a_SetIndividual(individual);
            a = whenwhere; //call copy constructor of 'DaTime'
    }

Об ошибке:

У вас нет конструктора по умолчанию для вашего класса DaTime.

Итак, что вы можете сделать, это передать значения DaTime ti вашему конструктору Appt и создать объект DaTime в a= new DaTime(a,b,c).

Или Пропустите объект по ссылке.

Надеюсь, что это поможет вам.

  • 0
    Спасибо за помощь. Это не решает мою ошибку, хотя имеет смысл по сравнению с моей попыткой найти решение. Я внес изменения, чтобы включить мою ошибку, так как, возможно, моя ошибка в другом месте.
  • 0
    @AllenS Мое решение исправляет эту ошибку. Я добавлю записку, объясняющую почему.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню