iostream — Почему были iostream_withassign, ostream_withassign & amp; классы istream_withassign удалены из системы ввода-вывода C ++?

До C ++ 98 в иерархии классов ввода-вывода C ++ было 3 названных класса. iostream_withassign, ostream_withassign & istream_withassign,

Функции-члены iostream_withassign учебный класс:

Конструкторы & Destructor

~ iostream_withassign

public:virtual ~iostream_withassign()

iostream_withassign

public:iostream_withassign()

Создает объект iostream_withassign. Это не делает никакой инициализации этого объекта.

оператор =

public:iostream_withassign& operator =(iostream_withassign& rhs)

Операторы присваивания
оператор =

Перегрузка 1

public:iostream_withassign& operator =(streambuf*)

Этот оператор присваивания берет указатель на объект streambuf и связывает этот объект streambuf с объектом iostream_withassign, который находится слева от оператора присваивания.

Перегрузка 2

public:iostream_withassign& operator =(ios&)

Этот оператор присваивания принимает ссылку lvalue на объект ios и связывает буфер потока, присоединенный к этому объекту ios, с объектом iostream_withassign, который находится слева от оператора присваивания.

Источник: этот.

Так же этот Говорит, что:

Класс ostream_withassign является вариантом ostream, который позволяет присваивать объекты. Предопределенные объекты cout, cerr и clog являются объектами этого класса и, таким образом, могут быть переназначены во время выполнения другому объекту ostream. Например, программа, которая обычно отправляет вывод на стандартный вывод, может быть временно направлена ​​на отправку своего вывода в файл на диске. Он также содержит конструктор, деструктор & = (присваивание) операторских функций.

Я не понимаю, почему эти классы существуют? Было ли какое-то использование этих 3 классов? Почему впоследствии эти 3 класса были удалены из стандарта C ++ 98? Какова причина?

См. Также иерархию классов потока C ++. У него нет этих 3 классов.

C ++ иерархия классов ввода / вывода

1

Решение

Они были признаны несовершенными. Они заменяются на:

  1. iostate rdstate() читает состояние потока.
  2. void clear(iostate state = goodbit) установить состояние потока.
  3. basic_streambuf<class charT, class Traits>* rdbuf() получить буфер потока.
  4. basic_streambuf<class charT, class Traits>* rdbuf(basic_streambuf<class charT, class Traits>* sb) установить буфер потока.
  5. basic_ios<class charT, class Traits>& copyfmt(basic_ios<class charT, class Traits>& rhs) установить все остальные данные членов RHS.
3

Другие решения

что не так с классами _withassign?

Согласованность. Поскольку считалось, что стандартные потоки ввода / вывода в C ++ 98 не копируются, изначально выполнялись соответствующие операции. private (до C ++ 11), а затем явно deleteих

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

Строго говоря, к тому же *_withassign Обертка добавит, что iostreamне мог сделать.


Например, программа, которая обычно отправляет вывод на стандартный вывод, может быть
временно направлено на отправку его вывода в файл на диске. Это также
содержит конструктор, деструктор & = (присваивание) операторских функций.

Ты можешь использовать rdbuf чтобы получить основную std::basic_streambuf поток в настоящее время использует и предоставляет другой, полученный другим стандартным потоком или тем, который вы написали, унаследовав от std::basic_streambuf класс как std::basic_filebuf делает, например.

То, что вы говорите, может быть легко достигнуто с помощью:

std::ofstream ofs{path};
auto oldbuf = cout.rdbuf( ofs.rdbuf() );
1

По вопросам рекламы [email protected]