在构造函数中调用不同的类'构造函数?

时间:2014-02-24 07:08:42

标签: c++ class constructor

在单独的.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的构造函数?我知道这种方法不起作用,因为DaTimea的实例会在constructor完成后死亡。

编辑:我得到的错误是:

    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&)

2 个答案:

答案 0 :(得分:2)

使a成为Appt的数据成员,并在构造函数初始化列表中初始化它:

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

此外,还不清楚是否要按值传递所有参数。请考虑改为传递const引用。

注意:您收到的错误似乎表明您的班级中有DaTime个数据成员,并且您正在初始化它在构造函数初始化列表中。这意味着必须执行默认初始化,并且由于DaTime没有默认构造函数,因此会出现错误。请记住:一旦您在构造函数的主体中,所有数据成员都已初始化。如果你没有明确地初始化它们,它们将被默认构造。

DaTime whenwhere;  // I thought this would initialize it 

这不是初始化。它只是一个成员声明。调用whenwhere构造函数时,DaTime将被初始化。在C ++ 11中,您还可以在声明点初始化:

DaTime whenwhere{arg1, arg2, aer3};

答案 1 :(得分: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类没有默认构造函数。

所以,你可以做的是传递DaTimeAppt的构造函数的值,并创建一个DaTime的对象a= new DaTime(a,b,c)

或者通过引用传递对象。

希望这会对你有所帮助。