C++ 使用委托构造函数时的成员初始化
我已经开始尝试C++11标准,我发现了一个问题,这个问题描述了如何从同一个类中的另一个ctor调用您的ctor,以避免使用init方法或类似方法。现在,我正在尝试同样的代码,如下所示: 水电站: cpp: 但这给了我一个错误:C++ 使用委托构造函数时的成员初始化,c++,gcc,c++11,ctor-initializer,C++,Gcc,C++11,Ctor Initializer,我已经开始尝试C++11标准,我发现了一个问题,这个问题描述了如何从同一个类中的另一个ctor调用您的ctor,以避免使用init方法或类似方法。现在,我正在尝试同样的代码,如下所示: 水电站: cpp: 但这给了我一个错误: 在构造函数“config::Tokenizer::Tokenizer(std::stringstream*)”中: /path/Tokenizer.cpp:14:20:错误:“config::Tokenizer::lines”的mem初始值设定项遵循构造函数委托我已尝试将
在构造函数“config::Tokenizer::Tokenizer(std::stringstream*)”中:
/path/Tokenizer.cpp:14:20:错误:“config::Tokenizer::lines”的mem初始值设定项遵循构造函数委托
我已尝试将Tokenizer()部分移到列表中的第一个和最后一个,但没有帮助
这背后的原因是什么?我应该如何修复它?我试着用
this->lines=lines将行(lines)
移动到body代码>相反,它工作正常。但是我真的希望能够使用初始化器列表。当您将成员初始化委托给另一个构造函数时,假设另一个构造函数完全初始化对象,包括所有成员(即在您的示例中包括行成员)。因此,您不能再次初始化任何成员
本标准的相关引用如下(重点):
(§12.6.2/6)mem初始值设定项列表可以使用表示构造函数类本身的任何类或decltype委托给构造函数类的另一个构造函数。如果mem初始值设定项id指定构造函数的类,它将是唯一的mem初始值设定项;构造函数是委托构造函数,由选择的构造函数是目标构造函数。[……]
您可以通过定义首先接受参数的构造函数版本来解决此问题:
然后使用委托定义默认构造函数:
Tokenizer::Tokenizer()
: Tokenizer(nullptr)
{
}
作为一般规则,您应该完全指定接受最多参数的构造函数版本,然后从其他版本进行委托(在委托中使用所需的默认值作为参数)。开始时,这似乎违反直觉,但实际上确实很有帮助!
Tokenizer::Tokenizer()
: expected('=')
{
}
Tokenizer::Tokenizer(std::stringstream *lines)
: Tokenizer(),
lines(lines)
{
}
Tokenizer::Tokenizer(std::stringstream *lines)
: lines(lines)
{
}
Tokenizer::Tokenizer()
: Tokenizer(nullptr)
{
}