2015-05-18 2 views
1

Im ищет создание вектора, который хранит список различных входных потоков, включая 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)); 
    } 

Проблема заключается в том, что компилятор выплевывает большую ошибку, которая идет глубоко в библиотеку шаблонов, которые я просто не могу расшифровать.

+0

попытаться сохранить указатели на потоки в векторе вместо значений – Alexander

+2

Потоки не могут быть скопированы. –

+1

Просто вопрос, почему вы используете для этого итератор, почему бы не просто push_back? например for (int i = 0; i

ответ

2

Здесь есть несколько проблем. Сначала это потоки не скопированные, поэтому вы не можете их скопировать в контейнер. Хотя, если у вас есть недавний компилятор, который его поддерживает, потоки подвижные.

Однако, потому что вы хотите, чтобы хранить различные типы в одном контейнере, которые являются полиморфными вы даже не можете переместить их. Вы не можете хранить в пространство, выделенное на std::istream, потому что вы получаете slicing (коррупции) в std::fstream.

Один из способов сделать это с помощью указателей хранить в контейнере:

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 не следует удалять.

Как вы решаете эту проблему, зависит от того, что вы пытаетесь сделать в целом, но смешать указатели, которые нужно удалить с помощью тех, которые не должны быть удалены, проблематично.

+0

Отлично, спасибо вам обоим, эти ответы проясняют многое. – Tristus

1

Эта программа не компилируется, потому что у вас нет конструктора по умолчанию для класса std :: istream.

Этот код будет скомпилирован, если вы используете ссылки вместо необработанного типа. Убедитесь, что вы свободны, когда вы удаляете их из вектора:

#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; 
} 
Смежные вопросы