Почему не может я создавать станд.:: стопка станд.:: ifstreams?

Почему делает следующее не, работайте:

#include <iostream>
#include <fstream>
#include <stack>

std::stack<std::ifstream> s;

- PT

6
задан Tyler McHenry 2 March 2010 в 13:57
поделиться

3 ответа

std :: stack (как и все контейнеры STL) требует, чтобы его содержащийся тип был «назначаемым» . Говоря языком STL, это означает, что он должен иметь конструктор копирования и оператор = . std :: ifstream не имеет ни одного из них.

Вы можете себе представить, почему вы не хотели бы иметь возможность копировать и назначать потоки ввода-вывода; семантика того, что должно происходить при наличии двух копий одного и того же потока, неочевидна. Должно ли чтение из одной копии или запись в нее влиять на положение другой копии? Должно ли закрытие одного потока закрывать другой? и т. д.

Если вы хотите иметь «контейнер для std :: ifstream s», то вам действительно следует сделать «контейнер для std :: ifstream * s». ". Неконстантные указатели всегда назначаются. Предостережение заключается в том, что в этом случае, конечно, вы должны убедиться, что вы удалили указатели самостоятельно, прежде чем разрушать контейнер, поскольку контейнер не будет делать этого за вас.

10
ответ дан 9 December 2019 в 20:42
поделиться

Поскольку потоки не копируются, вы можете технически поместить их в стандартные контейнеры.

Но мы можем обойти это, сохранив указатели на поток. Но вы не хотите хранить указатели на потоки (особенно если они динамически выделяются) в стандартном контейнере. Поэтому мы ищем решение.

Boost имеет концепцию контейнеров указателей.
Это позволяет вам динамически выделять объект и сохранять указатель в контейнере указателя, который затем становится владельцем объекта и дает вам доступ к динамическому объекту, как если бы он был объектом (а не указателем ).

Поскольку контейнер указателя становится владельцем, вам не нужно беспокоиться об удалении объекта. Контейнер сделает это.

Поскольку он предоставляет доступ к содержащимся в нем объектам как к объектам, а не к указателям, он позволяет вам использовать поток в стандартных алгоритмах более естественным образом (с использованием контейнера указателей).

2
ответ дан 9 December 2019 в 20:42
поделиться

Поддерживаю Тайлера (после голосования +1).

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

В целом, я нахожу это слишком сложным. Просто как эмпирическое правило, используйте в контейнерах только небольшие объекты. Если вы хотите сделать стек структур или классов, используйте указатели на них.

0
ответ дан 9 December 2019 в 20:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: