我刚刚开始学习来自C#背景的C ++。
我正在创建一个将解析CSV数据的类,我希望使用文件路径或流初始化该类。如果传递了文件路径,则应将_str_in
设置为新打开的ifstream
。
我的下面的代码编译但是在第二个构造函数上发出警告"引用成员被初始化为一个在构造函数退出后不会持久化的临时成员。 我猜这个警告涉及以下内容:
ifstream
已创建,_str_in
已设置为引用ifstream
的内存
_str_in
现在指向未分配的内存,可能会损坏。我已经尝试了不同的方法来完成这项工作,并检查了许多SO问题,但我很难过 - 有任何建议吗?
class TokenParser
{
std::istream& _str_in;
char _delim;
public:
TokenParser::TokenParser(std::istream& str_in, char delim) : _str_in(str_in), _delim(delim)
{
}
TokenParser::TokenParser(std::string& file_path, char delim) : _str_in(std::ifstream(file_path)), _delim(delim)
{
}
答案 0 :(得分:2)
问题几乎就是编译器描述的内容:std::ifstream(file_path)
创建的对象在构造函数完成时将消失,因此引用_str_in
会立即变为悬空。
您可以通过在std::ifstream
中创建TokenParser
对象并在调用第二个构造函数时使用它来解决此问题:
class TokenParser
{
std::ifstream _file;
std::istream& _str_in;
char _delim;
public:
TokenParser::TokenParser(std::istream& str_in, char delim) : _str_in(str_in), _delim(delim)
{
}
TokenParser::TokenParser(std::string& file_path, char delim) : _file(file_path), _str_in(_file)), _delim(delim)
{
}
...
}
答案 1 :(得分:0)
试试这个:
在std::move
<algorithm>
class TokenParser
{
std::istream&& _str_in; // notice the && 'universal reference'
char _delim;
public:
TokenParser::TokenParser(std::istream&& str_in, char delim)
: _str_in(std::move(str_in)), _delim(delim)
{}
// other ctors...
}