在构造函数中初始化流
Initializing stream in constructor
我刚刚开始学习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)
{
}
问题几乎是编译器所描述的:当构造函数完成时,std::ifstream(file_path)
创建的对象将消失,因此引用_str_in
将立即变得悬而未决。
您可以通过在 TokenParser
中创建一个 std::ifstream
对象并在调用第二个构造函数时使用它来解决此问题:
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)
{
}
...
}
试试这个:
在<algorithm>
中使用通用引用和std::move
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...
}
相关文章:
- 为什么std::vector和std::valarray初始化构造函数不同
- 初始化构造函数C++中结构的向量
- C++ 中常量属性的初始化构造函数错误
- 不正确的输出和变量未用Eclipse CDT初始化构造函数
- 如何使用嵌套初始化构造函数中的一维向量初始化矩阵
- 如何通过参数初始化构造函数中的数组?
- 是否有理由使用 malloc 初始化构造函数中的指针
- 如何在 c++ 中初始化构造函数中的二维数组
- 为什么初始化构造函数列表参数时会发生异常?
- 无法初始化构造函数
- 初始化构造函数的默认参数的优选方法是什么?
- 在C++17中使用空列表初始化构造函数时发生编译错误
- C++ 初始化构造函数初始化列表中的嵌套结构?
- 初始化构造函数c++中的向量
- g++ (GCC) 4.6.0 我有以下类,我正在尝试初始化构造函数的结构成员初始化列表
- 使用字符串文本初始化构造函数中的 std::array<char,x> 成员。海湾合作委员会错误?
- 初始化构造函数C++中函数的成员指针
- 在c++中初始化构造函数中的静态成员变量时出错
- memset()初始化构造函数中的对象
- 初始化构造函数C++中的成员向量