我有这段代码,在编译时会出现编译错误。
#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;
}
答案 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}
{
}