Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用委托构造函数时的成员初始化_C++_Gcc_C++11_Ctor Initializer - Fatal编程技术网

C++ 使用委托构造函数时的成员初始化

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初始值设定项遵循构造函数委托我已尝试将

我已经开始尝试C++11标准,我发现了一个问题,这个问题描述了如何从同一个类中的另一个ctor调用您的ctor,以避免使用init方法或类似方法。现在,我正在尝试同样的代码,如下所示:

水电站:

cpp:

但这给了我一个错误:
在构造函数“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)
{
}