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

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

HPP:

class Tokenizer { public: Tokenizer(); Tokenizer(std::stringstream *lines); virtual ~Tokenizer() {}; private: std::stringstream *lines; }; 

CPP:

 Tokenizer::Tokenizer() : expected('=') { } Tokenizer::Tokenizer(std::stringstream *lines) : Tokenizer(), lines(lines) { } 

但是,这给了我错误: In constructor 'config::Tokenizer::Tokenizer(std::stringstream*)': /path/Tokenizer.cpp:14:20: error: mem-initializer for 'config::Tokenizer::lines' follows constructor delegation我已经尝试移动Tokenizer()第一个和最后一个名单,但没有帮助。

这是什么原因,我应该如何解决? 我已经尝试使用this->lines = lines;lines(lines)移动到主体this->lines = lines; 相反,它工作正常。 但我真的很想能够使用初始化列表。

提前致谢!

当你委托成员初始化到另一个构造函数,有一个假设,其他构造函数完全初始化对象,包括所有成员(即在你的例子中包括lines成员)。 您不能因此再次初始化任何成员。

标准的相关引用是(重点是我的):

(§12.6.2/ 6)mem-initializer-list可以使用表示构造函数类本身的任何类或decltype委托给构造函数类的另一个构造函数。 如果一个mem-initializer-id指定了构造函数的类, 它将是唯一的mem初始化程序 ; 构造函数是委托构造函数,而构造函数是目标构造函数。 […]

你可以通过定义首先带有参数的构造函数的版本来解决这个问题:

 Tokenizer::Tokenizer(std::stringstream *lines) : lines(lines) { } 

然后使用委托定义默认的构造函数:

 Tokenizer::Tokenizer() : Tokenizer(nullptr) { } 

作为一般规则,您应该完全指定具有最大参数数量的构造函数的版本,然后从其他版本进行委派(使用所需的缺省值作为委派中的参数)。