输入流的向量?
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
对象。
您如何解决该问题取决于您总体上尝试做什么,但是将需要删除的指针与不应删除的指针混合在一起是有问题的。
我想创建一个向量来存储不同输入流的列表,包括 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
对象。
您如何解决该问题取决于您总体上尝试做什么,但是将需要删除的指针与不应删除的指针混合在一起是有问题的。