为什么在此代码中出现编译错误?

时间:2019-11-25 18:17:42

标签: c++ constructor

我有这段代码,在编译时会出现编译错误。

    #include <iostream>
    #include <string>
    using namespace std;

    struct Date{
      int day;
      int month;
      int year;
    };

  class appointment{
     public:
       appointment(int d,int m,int y,string n);
     private:
       struct Date date;
       string name;

   };

   int main()
   {
     appointment a(22,12,2019,"James"); 
   } 

   appointment::appointment(int d,int m,int y,string n) :
      date.day(d),date.month(m),date.year(y),name(n)
   {

   }

但是,当我注释构造函数并使用此版本的构造函数时,一切正常

  appointment::appointment(int d,int m,int y,string n) 
//date.day(d),date.month(m),date.year(y),name(n)
{
  date.day=d;
  date.month=m;
  date.year=y;
  name=n;
}

2 个答案:

答案 0 :(得分:4)

appointment的构造函数的member-initializer只能初始化appointment自己的直接成员。

它无法进入这些成员并直接初始化他们的成员。

必须初始化date,而不是date的成员。

现在,date本身没有构造函数,但是它不需要构造函数,因为您可以对其使用聚集初始化

appointment::appointment(int d,int m,int y,string n)
    : date{d, m, y}
    , name(n)
{}

第二次尝试都没有遇到问题,因为那没有初始化任何东西!它只是提供了一个分配序列(通过Date类型的公共接口可以实现),这很好。

有人可能会认为这是语言的局限性,但我认为这是明智的。您不希望人们只对您的课程进行半初始化。这可能导致不一致和不可预测的结果。

答案 1 :(得分:1)

您不能像这样一步一步地初始化对象。相反,请使用汇总初始化一次性地初始化整个date成员:

appointment::appointment(int d, int m, int y, std::string n)
    : date{d, m, y},
      name{n}
{
}