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

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

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

Конструкторы и деструкторы

~ 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. Например, программа, которая обычно отправляет вывод в stdout, может быть временно направлена ​​на отправку своего вывода в файл на диске. Он также содержит конструктор, деструктор & =(назначение) операторские функции.

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

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

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

2 ответа

Решение

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

  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.

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

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

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

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


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

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

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

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

C/C++ IO основаны на потоках, которые представляют собой последовательность байтов, входящих и выходящих из программ (как вода и масло, протекающие по трубе). В операциях ввода байты данных передаются из источника ввода (например, клавиатуры, файла, сети или другой программы) в программу. В выходных операциях байты данных передаются из программы в выходной приемник (например, консоль, файл, сеть или другая программа). Потоки действуют как посредники между программами и фактическими устройствами ввода-вывода таким образом, что освобождают программистов от обработки фактических устройств, чтобы архивировать независимые от устройства операции ввода-вывода.

Язык программирования C++ Stream Stream IO и File IO, пожалуйста, прочитайте следующую ссылку для более подробной информации.

http://www.ntu.edu.sg/home/ehchua/programming/cpp/cp10_io.html

Другие вопросы по тегам