Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.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++ 使用std::string初始化istream属性_C++ - Fatal编程技术网

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

C++ 使用std::string初始化istream属性,c++,C++,我有一个属性为std::istream&\u submission的类和接受istream并初始化属性的构造函数。 现在,我希望我的类接受一个字符串(不是istream)。我怎样才能做到? 它抱怨属性\u submission未初始化(必须显式初始化引用成员“submission”) 当前情况:Parser::Parser(std::istream&input\u stream):提交(input\u stream) 我希望有Parser::Parser(std::string input)这是

我有一个属性为
std::istream&\u submission的类
和接受istream并初始化属性的构造函数。 现在,我希望我的类接受一个字符串(不是istream)。我怎样才能做到? 它抱怨属性
\u submission
未初始化(
必须显式初始化引用成员“submission”

当前情况:
Parser::Parser(std::istream&input\u stream):提交(input\u stream)

我希望有
Parser::Parser(std::string input)

这是不可能的。由于您的数据成员只是(非
const
)引用,因此无法将临时
std::istringstream
绑定到它。(如果你能设法做到这一点,它会爆炸得很厉害。)

您可以做的是为您的类型提供两个属性,一个
std::istream&
和一个
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_};
};

请注意,声明顺序很重要:必须在
成员之前声明
stringstream
成员。

这是不可能的。由于您的数据成员只是(非
const
)引用,因此无法将临时
std::istringstream
绑定到它。(如果你能设法做到这一点,它会爆炸得很厉害。)

您可以做的是为您的类型提供两个属性,一个
std::istream&
和一个
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_};
};

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

我的水晶球上写着“使用构造函数初始化列表”。我的妻子每天晚上都要喝一瓶酒。现在我希望有一天晚上能带着一盒甜甜圈回家(不是葡萄酒)。我怎样才能做到呢?她抱怨她的酒杯没灌满。我怎么能用字符串初始化istream?哈哈,真有趣。但真的,伙计们,我应该使用stringstream吗?但是怎么做呢?(我是c++的新手)您的类希望将引用绑定到某个现有流。如果没有流,则无法将引用绑定到任何对象。你预计会发生什么?这个类如何处理这个流?std::string参数用于什么?我的水晶球上写着“使用构造函数初始化列表”。我有一个妻子,她每天晚上都要喝一瓶酒。现在我希望有一天晚上能带着一盒甜甜圈回家(不是葡萄酒)。我怎样才能做到呢?她抱怨她的酒杯没灌满。我怎么能用字符串初始化istream?哈哈,真有趣。但真的,伙计们,我应该使用stringstream吗?但是怎么做呢?(我是c++的新手)您的类希望将引用绑定到某个现有流。如果没有流,则无法将引用绑定到任何对象。你预计会发生什么?这个类如何处理这个流?std::string参数用于什么?在
stringstream\uu
成员上的大括号或init初始值设定项是相当冗余的,但是使用
std::istream&stream\u{stringstream\u}
而不是在ctor中是有意义的,并且在每个ctor中只提供一个mem初始值设定项。@JonathanWakely我知道
{
在这里不是必需的,但我想明确一点。你的另一个建议很聪明,我没想到。“但是我宁愿保留上面的例子,因为我觉得它更容易解释。”“乔纳森,你知道吗,我做到了。看起来好多了。谢谢!:-)不客气-我喜欢每个构造函数的对称性,只初始化需要构造函数参数的成员,而另一个具有“默认值”。。。虽然这有点微妙,因为不太明显的是,你永远不会同时使用两个默认值,只能使用其中一个。@JonathanWakely实际上,如果添加了第三个(默认)构造函数,你可以同时使用这两个默认值。在这种情况下,初始化一个空流是有意义的。当然,这一切都取决于OP想要如何使用这种类型。
stringstream\uu
成员上的大括号或init初始值设定项是相当冗余的,但是使用
std::istream&stream\u{stringstream\u}
而不是在ctor中是有意义的,并且在每个ctor中只提供一个mem初始值设定项。@JonathanWakely我知道
{
在这里不是必需的,但我想明确一点。你的另一个建议很聪明,我没想到。“但是我宁愿保留上面的例子,因为我觉得它更容易解释。”“乔纳森,你知道吗,我做到了。看起来好多了。谢谢!:-)不客气-我喜欢每个构造函数的对称性,只初始化需要构造函数参数的成员,而另一个具有“默认值”。。。虽然这有点微妙,因为不太明显的是,你永远不会同时使用两个默认值,只能使用其中一个。@JonathanWakely实际上,如果添加了第三个(默认)构造函数,你可以同时使用这两个默认值。在这种情况下,初始化一个空流是有意义的。当然,这完全取决于OP想要如何使用这种类型。