До 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 классов.
Они были признаны несовершенными. Они заменяются на:
iostate rdstate()
читает состояние потока.void clear(iostate state = goodbit)
установить состояние потока.basic_streambuf<class charT, class Traits>* rdbuf()
получить буфер потока.basic_streambuf<class charT, class Traits>* rdbuf(basic_streambuf<class charT, class Traits>* sb)
установить буфер потока.basic_ios<class charT, class Traits>& copyfmt(basic_ios<class charT, class Traits>& rhs)
установить все остальные данные членов RHS.что не так с классами _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() );