根据if语句初始化对象

时间:2014-07-11 18:04:02

标签: c++ c++11

我正在尝试仅使用变量来处理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

目前,我为每个代码使用了两个完整的代码副本。有关我如何做的任何建议吗?

谢谢

5 个答案:

答案 0 :(得分:5)

如何重构代码:

void process(std::istream & is)
{
    // ....
}

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

答案 1 :(得分:4)

你要做的是这样的事情:

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

那就是说你应该使用一个智能指针来保存istream指针以避免内存泄漏,正如@πάνταῥεῖ所指出的那样。

答案 2 :(得分:1)

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

if(isFile) {
    stream = new ifstream("whatever");
} else {
    stream = new istringstream("whatever");
}

getline(*stream, line);

确保删除它

答案 3 :(得分:1)

如果您不想自己管理内存,可以使用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)

答案 4 :(得分:0)

getline和&#34;用线&#34;做点什么在一个带有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);
}

它不会比这简单得多。