Почему классы 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 классов.
2 ответа
Они были признаны несовершенными. Они заменяются на:
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
не мог сделать.
Например, программа, которая обычно отправляет вывод в 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