同时采用委托构造函数初始化成员(Member initialization while using

2019-06-27 14:14发布

我已经开始尝试在C ++ 11标准,我发现这个问题,其中介绍了如何从同一类构造函数的另一个调用你的构造函数,以避免一个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我试着移动标记生成器()部分第一个和最后的名单,但没有帮助。

什么是这背后的原因,我应该如何解决? 我已经试过移动所述lines(lines)与到主体this->lines = lines; 而不是和它工作正常。 但我真的希望能够使用初始化列表。

提前致谢!

Answer 1:

当您委派成员初始化到另一个构造,有一种假设,即其他构造完全初始化对象,包括所有成员(即包括lines在你的例子成员)。 你不能因此而重新初始化任何成员。

从标准的相关报价(重点煤矿):

(§12.6.2/ 6)的MEM-初始化列表可以委托给使用表示构造的类本身的任何类 - 或decltype构造函数的类的另一个构造。 如果MEM-初始化-ID指定构造函数的类, 它应该是唯一的MEM-初始化 ; 构造是委托的构造,并且通过所选择的构造是在目标的构造。 [...]

您可以变通此定义, 首先需要参数的构造函数的版本:

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

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

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

作为一般规则,你应该充分指定版本,采用的参数最多的构造函数,然后从其他版本的委派(使用所需的默认值作为代表团参数)。



文章来源: Member initialization while using delegated constructor