使用 std::string 初始化 istream 属性

A B*_*was 0 c++

我有一个带有该属性的类std::istream & _submission;和一个采用 istream 并初始化该属性的构造函数。现在,我希望我的类接受一个字符串(不是 istream)。我怎样才能这样做?它抱怨该属性_submission未初始化 ( must explicitly initialize the reference member 'submission_')

目前状况:Parser::Parser(std::istream & input_stream) : submission_(input_stream) 我想要Parser::Parser(std::string input)

5go*_*der 5

这不可能。由于您的数据成员只是一个(非const引用,因此您无法将临时值绑定std::istringstream到它。(如果你设法以某种方式做到这一点,它就会戏剧性地爆炸。)

您可以做的是为您的类型提供两个属性: astd::istream&和 a std::istringstream。如果您传递了一个流,则不会使用std::istringstream,但如果您获得一个std::string,则用std::istringstream它初始化并将引用绑定到它。

class MyType
{

public:

  MyType(std::istream& is) : stream_ {is}
  {
  }

  MyType(std::string s) : stringstream_ {std::move(s)}
  {
  }

  // Now you can use stream_ in your other member functions.

private:

  std::istringstream stringstream_ {};

  std::istream& stream_ {stringstream_};
};
Run Code Online (Sandbox Code Playgroud)

请注意声明顺序很重要:您必须在成员之前stringstream_声明成员。stream_

  • “stringstream_”成员上的大括号或初始化初始化程序相当多余,但使用“std::istream&stream_{stringstream_}”而不是在构造函数中使用是有意义的,并且在每个构造函数中仅提供一个内存初始化程序。 (2认同)