在构造函数中初始化流

时间:2014-12-14 16:17:02

标签: c++

我刚刚开始学习来自C#背景的C ++。

我正在创建一个将解析CSV数据的类,我希望使用文件路径或流初始化该类。如果传递了文件路径,则应将_str_in设置为新打开的ifstream

我的下面的代码编译但是在第二个构造函数上发出警告"引用成员被初始化为一个在构造函数退出后不会持久化的临时成员。 我猜这个警告涉及以下内容:

  1. ifstream已创建,_str_in已设置为引用
  2. 在构造函数退出
  3. 后释放分配给ifstream的内存
  4. _str_in现在指向未分配的内存,可能会损坏。
  5. 我已经尝试了不同的方法来完成这项工作,并检查了许多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)
        {
        }
    

2 个答案:

答案 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...
}