我有一个带有该属性的类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)
这不可能。由于您的数据成员只是一个(非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_