输入流的向量?

Vector of input streams?

我想创建一个向量来存储不同输入流的列表,包括 cin 和一些文本文件。到目前为止我有这个。

vector<istream> inStreams;
vector<istream>::iterator streamsIterator;

streamsIterator = inStreams.begin();
streamsIterator = inStreams.insert(streamsIterator, cin); ////this has error!
for (char i = 1; argv[i] != NULL; i++) {
    streamsIterator = inStreams.insert(streamsIterator, ifstream(argv[i], ifstream::in));
    }

问题是编译器吐出一个很大的错误,这个错误深入到我无法破译的模板库中。

此程序无法编译,因为您没有 std::istream class.

的默认构造函数

如果您使用引用而不是原始类型,此代码将编译通过。确保在从矢量中删除项目时释放项目:

#include <vector>
#include <iostream>
#include <fstream>
#include <istream>

using namespace std;

int  main(int argc, char* argv[])
{
    vector<istream*> inStreams;
    vector<istream*>::iterator streamsIterator;

    streamsIterator = inStreams.begin();
    streamsIterator = inStreams.insert(streamsIterator, &cin); ////this has no error now
    for (char i = 1; argv[i] != NULL; i++) {
            auto str = new ifstream(argv[i], ifstream::in);
            streamsIterator = inStreams.insert(streamsIterator, str);
    }

    return 0;
}

这里有一些问题。首先是流不是 copyable 所以你不能将它们复制到容器中。尽管如果您有支持它的最新编译器,流是 可移动的

但是因为你想在一个多态的容器中存储不同的类型,所以你甚至不能移动它们。你不能在分配给 a 的 space 中存储 std::fstream std::istream 因为你得到 slicing(腐败)。

一种方法是使用 指针 存储在您的容器中:

int main(int, char* argv[])
{
    std::vector<std::istream*> istreams;

    istreams.push_back(&std::cin);

    for(char** arg = argv + 1; *arg; ++arg)
    {
        istreams.push_back(new std::ifstream(*arg));
    }
}

不幸的是,现在您遇到了所有权的问题。您添加的 std::ifstream 个使用 new 创建的对象需要删除,但不应删除全局 std::cin 对象。

您如何解决该问题取决于您总体上尝试做什么,但是将需要删除的指针与不应删除的指针混合在一起是有问题的。