根据if语句初始化对象

initialize object depending on if statement

本文关键字:对象 初始化 语句 if 根据      更新时间:2023-10-16

我正试图仅使用变量与ifstreamistringstream一起工作。我知道他们都是istream的孩子。因此,我试图仅创建一个类型为istream的变量,并根据某些输入进行初始化。

真正的问题是我要求用户输入文件路径或文件内容。然后,我将逐行读它。我试着这样做。

istream * stream;
if(isFile){
   ifstream a("fileOrContent");
   stream = &a;
} else {
   istringstream a("fileOrContent");
   stream = &a;
}
getline(stream,line)
// do something with line

我也试过这个

ifstream stream;
if(isFile){
   ifstream stream("fileOrContent");
} else {
   istringstream stream("fileOrContent");
}
getline(stream,line)
// do something with line

目前,我为每一个使用两个完整的代码副本。有什么建议吗?

谢谢

如何像这样重构你的代码:

void process(std::istream & is)
{
    // ....
}
int main()
{
    if (isFile)
    {
        std::ifstream is("foo.txt");
        process(is);
    }
    else
    {
        std::istringstream is(str);
        process(is);
    }
}

你要做的事情是这样的:

istream * stream;
if(isFile){
   stream = new ifstream("fileOrContent");
} else {
   stream = new istringstream("fileOrContent");
}
getline(*stream,line)

也就是说,你应该使用智能指针来保存istream指针,以避免内存泄漏,正如@π α ντα ρ ε ε所指出的。

我刚刚做了类似的事情。你就快到了

if(isFile) {
    stream = new ifstream("whatever");
} else {
    stream = new istringstream("whatever");
}
getline(*stream, line);

务必删除

如果你不想自己管理内存,你可以使用unique_ptr,它会在内存超出作用域时自动释放内存:

#include <memory>
std::unique_ptr<std::istream> stream;
if(isFile){
   stream = std::unique_ptr<std::istream>(new ifstream("fileOrContent"));
} else {
   stream = std::unique_ptr<std::istream>(new istringstream("fileOrContent"));
}
getline(*stream,line)

getline和"do something with line"放在接受std::istream &参数的函数中

然后创建ifstreamistringstream,并将函数调用放入if/else分支中。

void DoSomethingWithLine(std::istream &stream)
{
    getline(stream,line);
    // do something with line
}
if (isFile){
   ifstream a("fileOrContent");
   DoSomethingWithLine(a);
} else {
   istringstream a("fileOrContent");
   DoSomethingWithLine(a);
}

没有比这更简单的了