这就是发生的事情(我简化了问题以更容易看到(:
#include<iostream>
class number_holder{
public:
int value;
number_holder(int value_to_set){
this->value=value_to_set;
}
};
class number_holder_pair{
public:
number_holder first;
number_holder second;
number_holder_pair(number_holder first,number_holder second)
{
this->first=first;
this->second=second;
}
};
我知道将number_holder(){}
添加到number_holder
类中可以解决问题,但为什么需要这样做呢?
在此构造函数中:
number_holder_pair(number_holder first, number_holder second)
{ // <--
this->first=first;
this->second=second;
}
在到达标记行之前,必须初始化所有成员。然而,number_holder
没有默认的构造函数,因此first
和second
成员不能被默认构造,代码也不会编译。
正如您所注意到的,添加一个默认构造函数:
number_holder() {}
解决了这个特殊的问题,并允许代码进行编译。请注意,此修复程序并不完全正确,因为您的value
成员仍未初始化。相反,你应该这样做:
int value = 0;
number_holder() = default;
但是,您不一定必须提供默认构造函数,只要在达到number_holder_pair
构造函数的定义之前初始化所有number_holder
成员:
number_holder_pair(number_holder first,number_holder second)
: first(first), second(second) {}
此语法称为成员初始值设定项列表。